У меня есть приложение с реализованным локальным сервером, который обрабатывает запросы из веб-интерфейса. 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 из фонового потока без выхода из текущего метода (фонового потока)?
Или можно вручную переключить/принудительно выполнить цикл выполнения?