在后台获取中加载UIWebView

时间:2013-10-30 16:48:33

标签: ios uiwebview ios7

简短版本:在我的应用程序背景中,fetch的工作方式就像魅力一样,但是当我尝试在webview中加载内容时,它什么都不做!

长版:我在项目中设置了正确的功能,设置了获取间隔并实现了

- (void) application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

示例中的方法,它的工作原理。但是,为了完成我的后台提取,我需要在UIWebView中加载一些内容。这不起作用。当我打电话时,只是过程以某种方式“迷路”:

[myWebview loadRequest:request];

(当然它在前景时有效,但在后台无效)。

我也尝试强制将webview加载到主线程中,但系统只是暂停它,直到应用程序以前台模式返回(这是有意义的,我们在后台!)

那么,有一种方法可以在后台加载UIWebView吗?请注意我不能简单地使用NSURLSession下载内容,因为网页包含加载某些框架的javascript(我不能要求重新设计网页)。

编辑:当我写这个问题时,我可能没有足够的crear,但是在背景中尝试在main_queue中执行任务(使用dispatch_async o同样的方法)提取不起作用。在问之前我试过了......

2 个答案:

答案 0 :(得分:3)

如果要从用户界面更新元素,则必须在应用程序的主队列(或线程)中访问它们。我建议您继续在后台获取所需的数据,但是当需要更新UIWebView时,请在主线程中执行此操作。你可以这样做:

    dispatch_async(dispatch_get_main_queue(), ^{

        // Load fetched data in the Web View

    });   

或者您可以创建一个方法来更新UIWebView上的数据,并使用以下方法从后台线程调用它:

[self performSelectorOnMainThread:@selector(method:) withObject:fetchedData waitUntilDone:YES];

这将确保您从正确的线程访问UIWebView。

希望这有帮助。

答案 1 :(得分:2)

2013年11月11日(iOS 7.0.3)看起来不可能。 我只是留下这个答案,所以人们不会得到错误的信息。

如果您的应用程序位于前景中,则Eduardo Arenas Prada的解决方案可以完美运行,但不会在后台获取中。