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

时间:2010-10-13 23:26:37

标签: iphone ios multithreading grand-central-dispatch nsoperation

我有一个需要将数据(使用POST)发送到服务器的应用程序。此功能必须位于其中一个NavigationController子控制器上,用户应能够远离此控制器和/或关闭应用程序(仅支持iPhone4 / iOS4)。 我应该使用线程/ NSOperations或/并使用现有的异步方法发送数据吗? 任何想法/最佳实践如何实现这个?

5 个答案:

答案 0 :(得分:31)

好的,我会回答我自己的问题。 首先,像tc所说的那样,最好在应用程序委托上进行此调用,以便可以关闭NavigationController中的View。 其次,使用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]

查看此时间

答案 1 :(得分:4)

我只是使用NSURLConnection。如果要发送multipart / form-data,这有点棘手(参见SimpleURLConnections / PostController.m示例)。我会把它贴在app委托中,但我很懒。

除非非阻塞I / O(即NSURLConnection)太慢,否则您根本不必担心线程。线程有自己的开销,线程间的通信很痛苦,而且死锁很糟糕。

需要做的是启动后台任务以允许你的应用程序在后台运行时继续执行(结束connectionDidFinishLoading中的后台任务:和connection:didFailWithError)。 Backgrounded应用程序大约需要10分钟才能完成执行后台任务。

答案 2 :(得分:1)

使用ASIHTTP并设置队列。您可以在此处找到所需的所有信息:

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

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

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

答案 3 :(得分:0)

我肯定会为任何需要在用户做其他事情时运行的长时间运行进程建议第二个线程。

您需要考虑的另一件事是,如果用户启动该过程然后点击主页按钮将会发生什么。如何通过中断来实现服务器交互?用户下次进入应用程序时可以继续吗?等

答案 4 :(得分:0)

我想支持提到的帖子:

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

      bgTask = UIBackgroundTaskInvalid;
}];

但是也要指出,您可能希望将您的工作单元封装在NSOperation子类中。这将使其非常可重复使用,并且当与NSOperationQueue结合使用时,会自动处理线程,而不是。之后,当您想要更改代码或将其显示在应用中的其他位置时,移动或编辑将会非常简单。

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

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