后台networking调用 – iOS

我需要在后台实现发布一些数据到networking服务器。 只是澄清,“在后台”,我不是指使用像AsyncTaskASIHTTPRequest[request startAsynchronous]方法显示旋转图标和发布数据到Web服务的正常方式。 我需要维护一个线程可以asynchronous地开始处理和发布到Web服务,而用户在应用程序中工作的数据队列。

我正在寻找一些devise这样的队列的帮助,特别是在一些边缘情况下,例如用户接收呼叫,在post发生时注销应用程序,用户在应用程序离开应用程序时转到不同的post发生之类的。 你将如何处理这些情况? 有没有可以推荐的源代码呢?

谢谢,
Teja公司。

我最近在自己的工作中开始使用NSOperationQueue来控制后台networking请求。 NSOperation处理在后台线程(或前台,如果UI更新需要)上执行asynchronous运行任务(例如networking操作)所需的大部分样板代码。

它也允许跨队列的依赖关系; 例如,我在我的应用程序中使用了两个队列:

第一个日程安排图像下载,在一个最大并发2,在后台。 每个图像下载都有一个相应的完成处理程序(作为一个NSBlockOperation ),它依赖于图像下载完成。 这些操作位于[NSOperationQueue mainQueue] ,它在主线程上运行,允许它们更新UI(具体来说就是相应的UIImageView )。

请注意, NSOperationNSOperationQueue不仅适用于networking请求,而且也适用于可以分为primefaces任务并且同时调度的任何操作。

这里是苹果关于这个话题的介绍文档。

自己实现了类似的东西,我会build议使用服务而不是线程进行networking调用。 这样,即使你的活动被杀死,你确定你的networking电话将被执行。

然后为了实现队列,我build议你看看IntentService(http://developer.android.com/reference/android/app/IntentService.html)

从文档:

IntentService是一个服务的基类,用于处理asynchronous请求(表示为Intents)。 客户通过startService(Intent)调用发送请求; 该服务将根据需要启动,使用工作线程处理每个Intent,并在工作不成功时自行停止。

这种“工作队列处理器”模式通常用于卸载应用程序主线程中的任务。 IntentService类的存在是为了简化这种模式,并照顾机制。 要使用它,扩展IntentService并实现onHandleIntent(Intent)。 IntentService将收到Intents,启动一个工作线程,并根据需要停止服务。

所有请求都在单个工作线程上处理 – 它们可能需要的时间(并且不会阻塞应用程序的主循环),但是一次只能处理一个请求。

如果您的应用程序足够简单,则可以使用sendBroadCast()在您的活动和IntentService之间共享信息和通知

创build一个封装线程的单例:

在你的对象的初始化:

 [NSThread detachNewThreadSelector:@selector(mainPosterThread) toTarget:self withObject:nil]; - (void)mainDownloaderThread { if( [NSThread respondsToSelector:@selector(setThreadPriority:)] ) { [NSThread setThreadPriority:0.1]; } NSString *urlToDownload = nil; while(shouldRun) { // Take next data to post in a queue (lastObject of a NSArray for example) if( nextDataToPost ) { // Post } else { // Sleep for some time. } } } 

当应用程序在多任务支持的设备上转到后台/前台时,您也可以拥有停止/启动线程的方法。 如果不支持多任务处理,请在停止时将发布的数据保存在队列中(如果不是太长),并在启动时恢复它们。 最大的挑战是pipe理能够取消当前上传,而应用程序将结束。

这是我写在每一个新的应用程序中已经完善的一个问题。 基本上我想要networkingfunction是asynchronous的,这是我用本地function编写的。 如果您有兴趣,我很高兴向您展示这些代码。

首先,我build议你在主线程上进行所有的networking调用,而不是同步地使用一个委托进行主线程调用。 这样序列化/同步/并发不是问题。 而且由于类是networking委托,我只是发送一个类到新的连接有一个新的委托实例。

 [[NSURLConnection alloc] initWithRequest:request delegate:del] autorelease]; eg - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data