2012-06-12 91 views
3

我试图增加对退出我的iOS应用前景后,完成任务的支持。所有我在互联网上看到了教程,点我的应用程序委托写这样的事情:iOS的后台任务完成编程

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    if ([[UIDevice currentDevice] isMultitaskingSupported]) { 
     UIApplication *application = [UIApplication sharedApplication]; 
     __block UIBackgroundTaskIdentifier background_task; 
     background_task = [application beginBackgroundTaskWithExpirationHandler:^{ 
      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      //DO STUFF IN BACKGROUND HERE 
      MyTask *task = [[MyTask alloc] initWithURL:@"http://google.com"]; 
      [task setDelegate:self]; 
      [task start]; 

      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }); 
    } 
} 

的任务是能够启动,但启动后,下一行被处理,我的应用程序被杀害。我能够告诉你何时MyTask由于委托调用停止,但我怎么改变我的程序,以便后台任务被设置为无效委托被调用后。我会移动

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

到委托功能,还是我需要做别的事情。

预先感谢您的帮助, Guvvy

回答

6

您在每次呼叫后台线程dispatch_async是已。该方法将立即返回,但您的块将继续运行。

您的问题似乎是您的启动方法运行另一个异步进程,以便该方法立即返回,并且您的后台任务在[task start]能够做任何有意义的事情之前被杀死。

如果你在委托中去掉background_task的路由,你还需要创建一个ivar来存储background_task,这样你的委托方法才能到达它。这似乎有点沉重。

既然你在后台线程是已经,我的建议是你要重构[task start]所以它是同步的。这样,所有有意义的工作将在下一行被处理之前执行,并且background_task被杀死。这看起来更清晰,并且后台任务的所有内容都很好地包裹在发送给dispatch_async的块中。

+0

hi @ djibouti33你可以详细说明你试图说的话:“我的建议是重构[任务开始],所以它是同步的。” 。我在600秒后使用NStimer调用方法。但bgTask瞬间过期的应用程序进入后台 –

+1

方法[任务开始]是一个异步方法,这意味着它立即返回(进行任何工作之前),然后background_task被打死。我使它同步,该方法将阻止任何其他执行,直到它完成,然后可以在正确的时间成功地终止background_task。 – djibouti33

-2

您可以下面的代码完全删除:

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

当你的任务已经过期,iOS设备会打电话给你handlerExpiration方法将其杀死。 欲了解更多信息,请访问Background for iOS

+0

这显然是错误的。如果你没有在指定的时间内调用endBackgroundTask:你的应用程序将被完全杀死,而不是在用户眼中保持暂停和“启动”。请参阅文档https://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/endBackgroundTask: –