在iOS4设备上发送大量数据的最佳做法?

我有一个应用程序需要发送数据(使用POST)到服务器。 此function必须在其中一个NavigationController子控制器上,用户应该能够离开此控制器和/或closures应用程序(只支持iPhone4 / iOS4)。 我应该使用线程/ NSOperations还是/和使用现有的asynchronous方法发送数据? 任何想法/最佳实践如何实现这一点?

好的,我会回答我自己的问题。 首先,像tc说的那样,最好在应用程序委托上进行这个调用,以便可以closuresNavigationController中的View。 其次,用beginBackgroundTaskWithExpirationHandler:标记后台处理的开始,并用beginBackgroundTaskWithExpirationHandler:结束endBackgroundTask:像这样:

。H:

UIBackgroundTaskIdentifier bgTask;

.M:

 - (void)sendPhoto:(UIImage *)image { UIApplication *app = [UIApplication sharedApplication]; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; NSLog(@"Sending picture..."); // Init async NSURLConnection // .... } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"Picture sent."); UIApplication *app = [UIApplication sharedApplication]; if (bgTask != UIBackgroundTaskInvalid) { [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; } } 

在iOS终止您的应用程序之前,您有10分钟的时间。 你可以用[app backgroundTimeRemaining]检查这个时间

我只是使用NSURLConnection。 如果你想发送multipart / form-data(参见SimpleURLConnections / PostController.m例子),这有点棘手。 我会坚持在应用程序的代表,但我很懒。

除非非阻塞I / O(即NSURLConnection)太慢,否则不应该担心线程。 线程有自己的开销,线程间通信是一种痛苦,僵局是可怕的。

你需要做的是开始一个后台任务,让你的应用程序继续执行,而后台(结束后台任务在connectionDidFinishLoading:和连接:didFailWithError)。 为了完成执行后台任务,背景应用程序大约需要10分钟。

使用ASIHTTP并设置一个队列。 所有你需要的信息可以在这里find:

http://allseeing-i.com/ASIHTTPRequest/

这是完成你想要完成的最简单的方法。 为了发送大量数据,最好在后台发送以保持UI的响应。 ASIHTTPRequest提供了你需要踢多个查询(即进度检查,callback等)的所有方法。

它被大量的iPhone应用程序所使用。

我肯定会build议第二个线程的任何长期运行的过程中需要运行,而用户正在做别的事情。

你需要考虑的另一件事是如果用户启动进程然后点击主页button将会发生什么事情。 服务器互动如何被中断影响? 当用户下一次进入应用程序时可以继续吗? 等等

我想支持提到的post:

 bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; 

但是也要指出,你也可能想把你的工作单元封装在一个NSOperation子类中。 这将使其非常重用,当与NSOperationQueue结合时,会自动处理线程,而不是。 然后,当你想改变你的代码,或者让它出现在你的应用程序中的不同位置时,移动或编辑将是微不足道的。

关于使用操作队列的一个注意事项是,在这种情况下,您实际上会希望从队列中发送同步url请求。 这将使您不必担心并发操作。 以下是您可能会觉得有帮助的链接:

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/