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

标签 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 做错了吗?以这种方式工作似乎太简单了,但文档似乎就是这么说的。

任何帮助,非常感谢。

-- 约翰

最佳答案

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

我上面的代码过早地执行了“结束”代码,因此几乎立即结束了后台执行。

这样做的方法是做类似的事情:

   // 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;
}

它就像一个魅力。

关于iOS - 如何在后台完成长进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7959602/

相关文章:

java - iOS椭圆曲线 key 用于Java后端加密解密

c# - Xamarin.Forms 的 native 嵌入 : not finding UIKit in global namespace,

objective-c - 如何从iPhone中的标签文本创建声音?

iOS - 通过邮件发送 URL 在模拟器和设备中显示不同的行为

iphone - 访问 UIWebView 的 subview 是否违反 Apple 3.3.1 协议(protocol)

iphone - touchesBegan 和 touchesMoved

ios - 应用程序使用什么技术来实时同步数据?

ios - 从核心数据中的一对多关系中删除对象

ios - 拖动按钮时 ScrollView 不滚动

ios - 制作一个将 UIImage 保存到照片库的方法