2012-08-27 50 views
2

我正在使用串行调度队列来在用户将应用程序移动到背景时序列化一些网络请求。移动到后台后保持调度队列运行5秒

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

我还想写在磁盘上,其余的,让他们可以在用户打开应用程序的下一次发送。

实现此目的的最佳方式是什么?

+1

那么,你能编辑你的问题有更好的解释吗?另外,对于你说的你写的代码,你能引用实际的代码吗? – TheNavigat

回答

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:通知你在后台完成处理的OS。最后确保你将backgroundTask变量重置为UIBackgroundTaskInvalid。

+0

我需要它与iOS 3.x兼容,但我相信这种方法不对,对不对? – yannis

+0

这是正确的,这会不会是与iOS 3.x的兼容我想现在放弃对iOS 3.x的支持是非常安全的。 –

+0

这个答案应该有更多选票,+1 – Houssni