Gav*_*avy 3 xcode objective-c multitasking ios4
我正在尝试在退出iOS应用程序的前台后添加对完成任务的支持.我在互联网上看到的所有教程都指出我在Application Delegate中写这样的东西:
- (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;
});
}
}
Run Code Online (Sandbox Code Playgroud)
该任务能够启动,但在启动后,下一行将被处理,我的应用程序将被终止.我可以告诉MyTask由于委托调用而停止的时间,但是如何更改我的程序,以便在调用委托后将后台任务设置为无效.我会搬家吗?
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
Run Code Online (Sandbox Code Playgroud)
委托功能,还是我需要做其他事情.
提前感谢您的帮助,Guvvy
根据您的来电,您已经在后台主题中dispatch_async.该方法将立即返回,但您的块将继续运行.
您的问题似乎是您的start方法运行另一个异步进程,因此该方法立即返回,并且您的后台任务在[task start]能够执行任何有意义的操作之前被终止.
如果你background_task在你的委托中进行杀戮的路线,你还必须创建一个ivar来存储,background_task这样你的委托方法就可以实现.这看起来有点沉重.
由于你已经在后台线程,我的建议是你重构,[task start]所以它是同步的.这样,所有有意义的工作都将在处理下一行background_task并被杀死之前执行.这看起来更干净,后台任务的所有内容都很好地包装在发送到dispatch_async的块中.
| 归档时间: |
|
| 查看次数: |
6122 次 |
| 最近记录: |