iOS - 如何在后台完成长流程

时间:2011-10-31 20:52:59

标签: ios objective-c cocoa-touch facebook-graph-api

我的应用将视频上传到Facebook。即使不耐烦的用户在上传过程中点击了主页按钮,我也希望在后台完成上传。

经过一番阅读,我试过了这个:

     UIBackgroundTaskIdentifier bti = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
         [[UIApplication sharedApplication] endBackgroundTask:bti];
     }];

     [fb requestWithGraphPath:@"me/videos"
                    andParams:params
                andHttpMethod:@"POST"
                  andDelegate:self];

     [[UIApplication sharedApplication] endBackgroundTask:bti]; 

使用fb请求方法完成工作。视频通过http连接上传到Facebook。这样可以正常工作,但如果您在上传过程中通过单击“主页”按钮来设置应用程序,则会暂停上载。如果您预览应用程序,则会继续上传。

我希望会发生的是上传会在后台完成。

有什么希望让它发挥作用?我是否在整个beginBackgroundTask中做错了什么?以这种方式工作似乎太简单了,但这就是文档似乎所说的。

任何帮助,非常感谢。

- 约翰

2 个答案:

答案 0 :(得分:15)

好的,我明白了。您需要在后台完成的长任务开始时执行“开始”代码,即使在应用程序退出后也是如此,然后在任务完成时执行“结束”代码。

上面的代码太早执行'end'代码,因此几乎立即结束了后台执行。

这样做的方法是做一些事情:

   // make sure save can complete in the background
    if ([[UIDevice currentDevice] isMultitaskingSupported])
        backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}];

当长任务开始时。正如上面提到的那样,hypercrypt,'backgroundTaskID必须是一个ivar,或者当长任务完成时你可以得到的东西。

任务完成后,执行以下操作:

if ([[UIDevice currentDevice] isMultitaskingSupported]) {
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
    backgroundTaskID = UIBackgroundTaskInvalid;
}

它就像一个魅力。

答案 1 :(得分:9)

您需要在委托回调中调用[[UIApplication sharedApplication] endBackgroundTask:bti];。您需要将bti存储在ivar中或作为静态变量存储。