如何在退出当前方法之前在新的UIWebView中加载页面内容

时间:2014-11-26 13:17:52

标签: ios objective-c iphone uiwebview nsrunloop

我有一个实现本地服务器的应用程序,它处理来自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?

或者可以手动切换/强制执行循环执行吗?

1 个答案:

答案 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以后在异步线程中运行,保持主线程清晰并响应所有设备。

Apple Concurrency Guide