我有一个实现本地服务器的应用程序,它处理来自Web前端的请求。 UIWebView呈现一些GUI,用户进行一些交互,我处理他的请求并将响应发送回webview。
有时候我收到一些要求打开第二个webview的请求(例如facebook登录),并在当前方法中等待结果从第二个webview返回。
当我在iDevice上使用双核处理器运行此类案例时,它按预期工作。 但是当我在单核iPhone 4上运行它时,webview处理被阻止,直到我离开当前方法(带有等待指示符的白页)。
我通过为当前线程设置sleep来解决这个问题,因此主线程将有时间在其运行循环中处理事件(如果我正确理解了这一点)
- (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?
或者可以手动切换/强制执行循环执行吗?
答案 0 :(得分:0)
现在我不确定这是否有效,此刻无法测试。但是:
您可以尝试使用Operation Dependencies将操作作为队列中的单独操作。
在您使用此方法的情况下:
-(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];
}
通过阅读“并发指南”,您可以看到不同队列的操作依赖性。这意味着您可以确保UI在主线程中运行,Web以后在异步线程中运行,保持主线程清晰并响应所有设备。