当用户将应用程序移动到后台时,我正在使用串行调度队列来序列化某些网络请求。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
dispatch_queue_t opQ = dispatch_queue_create("com.myapp.network", NULL);
dispatch_async(opQ, ^{
[self sendNetworkData1];
[self sendNetworkData2];
[self sendNetworkData3];
});
}
问题是,当他们在我创建的队列上运行时,应用程序即使在5秒内也不会保持活动状态。
相反,当我在队列外发送相同的请求时,它们被发送大约8秒。但应用程序崩溃后。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self sendNetworkData1];
[self sendNetworkData2];
[self sendNetworkData3];
}
我还想在磁盘上写下其余的,以便下次用户打开应用程序时发送它们。
实施此方法的最佳方法是什么?
答案 0 :(得分:3)
当应用程序进入后台时,如果需要额外的时间来完成某项任务,您将需要通知操作系统。详细文档如下:http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html。这是一个快速而肮脏的补丁。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
__block UIBackgroundTaskIdentifier backgroundTask; //Create a task object
backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^ {
[application endBackgroundTask:background_task];
backgroundTask = UIBackgroundTaskInvalid; //Set the task to be invalid
}];
dispatch_queue_t opQ = dispatch_queue_create("com.myapp.network", NULL);
dispatch_async(opQ, ^{
[self sendNetworkData1];
[self sendNetworkData2];
[self sendNetworkData3];
[application endBackgroundTask:background_task];
backgroundTask = UIBackgroundTaskInvalid; //Set the task to be invalid
});
}
最重要的是你通过beginBackgroundTaskWithExpirationHandler通知应用程序需要在后台运行:当你完成调用endBackgroundTask时:这是通知操作系统你在后台完成处理。最后确保将backgroundTask变量重置为UIBackgroundTaskInvalid。