2011-10-31 61 views
9

我的应用上传视频到Facebook。我想在后台完成上传,即使不耐烦的用户在上传过程中点击主页按钮。iOS - 如何在后台完成漫长的过程

一些阅读后,我尝试这样做:

 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事情上做错了什么?这样做似乎太简单了,但这正是文档似乎所说的。

任何帮助,非常感谢。

约翰 -

+0

@jhon我需要在后台模式下上传视频。我可以这样做起诉这个代码块吗?是否有任何机会,苹果可能会拒绝我的应用程序,因为在后台执行长时间运行的进程有限制 –

回答

9

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

+0

感谢您让我走上正轨。我提供了一个更详细的答案,对于那些可能会遇到麻烦的人。 – John

15

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

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

做到这一点的方法是做这样的事情:在长期的任务开始时

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

。正如上面的高级加密所说的,'backgroundTaskID必须是ivar,或者当长期任务完成时你可以获得的东西。

任务完成后,执行类似:

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

它的工作原理就像一个魅力。

+2

John - 你剥离一个线程并把所有这些放到线程中,还是等待来自新线程的信号,然后在主线程上调用endBackgroundTask? – Chris

+1

@Chris我认为把这个过程放在一个新线程上是一个好主意。如果您不得不在后台执行此操作,则可能需要在另一个线程上执行一个漫长而复杂的任务,以避免堵塞UI。 –