2

当用户将应用程序移动到后台时,我正在使用串行调度队列来序列化一些网络请求。

- (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];
}

我还想把剩下的写在磁盘上,以便下次用户打开应用程序时发送。

实现这一点的最佳方法是什么?

4

1 回答 1

2

当应用程序进入后台时,如果它需要额外的时间来完成某些任务,您将需要通知操作系统。详细文档在这里: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。

于 2012-08-27T20:10:43.383 回答