iOS - 如何在后台完成漫长的过程

Joh*_*ohn 9 cocoa-touch objective-c facebook-graph-api ios

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

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

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

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

     [[UIApplication sharedApplication] endBackgroundTask:bti]; 
Run Code Online (Sandbox Code Playgroud)

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

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

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

任何帮助,非常感谢.

- 约翰

Joh*_*ohn 15

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

我上面的代码过早地执行'end'代码,因此几乎立即结束了后台执行.

做到这一点的方法是做一些事情:

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

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

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

if ([[UIDevice currentDevice] isMultitaskingSupported]) {
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
    backgroundTaskID = UIBackgroundTaskInvalid;
}
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.

  • John - 你是否剥离了一个线程并将所有这些放入线程中,或者你是否等待来自新线程的信号然后在主线程上调用endBackgroundTask? (2认同)

hyp*_*ypt 9

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