Как загрузить содержимое страницы в новом UIWebView перед выходом из текущего метода

У меня есть приложение с реализованным локальным сервером, который обрабатывает запросы из веб-интерфейса. UIWebView представляет некоторый графический интерфейс, пользователь выполняет некоторое взаимодействие, я обрабатываю его запросы и отправляю ответы обратно в веб-просмотр.

Иногда я получаю запрос, который требует открытия второго веб-просмотра (например, для входа в Facebook) и ожидания в текущем методе результатов для возврата из этого второго веб-просмотра.

Когда я запускаю такой случай на iDevice с двухъядерным процессором, он работает, как и ожидалось. Но когда я запускаю его на одноядерном iPhone 4, обработка веб-просмотра блокируется до тех пор, пока я не выйду из текущего метода (белая страница с индикатором ожидания).

Я решил это, поместив сон для текущего потока, чтобы у основного потока было время для обработки событий в его цикле выполнения (если я правильно это понимаю)

 - (void)requestProcessingMethod { // <-- on background thread
       someCalculations ...

       dispatch_sync(dispatch_get_main_queue(), ^{
       [self displayFacebookLoginWebView];
       });

       while(!facebookReturnCondition){
           [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
           [NSThread sleepForTimeInterval:0.5]; // <-- on single core without this
                                                //     facebook webview will not load the login page
       }

       return response; //
   }

Я не доволен этим. Установка потока для сна выглядит очень плохим решением.

Есть ли способ добавить работающий UIWebView из фонового потока без выхода из текущего метода (фонового потока)?

Или можно вручную переключить/принудительно выполнить цикл выполнения?


person objc3p0    schedule 26.11.2014    source источник


Ответы (1)


Теперь я не уверен, что это сработает, пока не могу проверить. Но:

Вы можете попробовать использовать операции как отдельные операции в очереди, используя зависимости операций.

в вашем случае, когда вы используете этот метод:

-(void)methodThatCallsRequestProcessingMethod {

   NSOperationQueue *queue = [[NSOperationQueue alloc]init];

   NSInvocationOperation* theMainThreadOp = [[NSInvocationOperation alloc] initWithTarget:self
                    selector:@selector(displayFacebookLoginWebView) object:nil];

   NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self
                    selector:@selector(requestProcessingMethod) object:nil];
   [theOp addDependency: theMainThreadOp];

   [[NSOperationQueue mainQueue] addOperation: theMainThreadOp];
   [queue addOperation:theOp];

}

Из чтения Руководства по параллелизму видно, что у вас могут быть зависимости операций от разных очередей. Это означает, что вы можете гарантировать, что пользовательский интерфейс будет работать в основном потоке, а затем веб-интерфейс будет работать в асинхронном потоке, сохраняя основной поток чистым и отзывчивым на всех устройствах.

Руководство по параллелизму Apple

person Naughty_Ottsel    schedule 27.11.2014