12

我正在创建一个应用程序,其中我正在从服务器下载一些数据。在后台运行时,我希望该连接应继续运行,以便可以下载数据。我知道appDelegate中有方法

- (void)applicationDidEnterBackground:(UIApplication *)application  

当应用程序进入后台时调用。但是由于连接是在 viewController 中创建的,如何在 appDelegate 中进行管理
还有/还有其他方法可以做到吗?我已经浏览了这个链接,但是有什么简单的实现吗?

4

3 回答 3

15

在后台继续执行某些操作的一种方法是创建一个单独的线程来进行下载。在线程内部,将您的下载操作括在对 beginBackgroundTaskWithExpirationHandler: 和 endBackgroundTask 的调用之间。您不需要检查您是否在后台运行,您只需始终调用这两个方法。

// Tell iOS this as a background task in case we get backgrounded
UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] 
          beginBackgroundTaskWithExpirationHandler:NULL];

//----------------------------------------------
// Perform your download operations here
//----------------------------------------------
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

// Tell iOS that we are done with stuff that needed to keep going even if backgrounded    
[[UIApplication sharedApplication] endBackgroundTask:taskId];
于 2012-06-27T01:32:10.420 回答
3

[编辑]对不起,我不正确,正如评论中指出的那样,您可以延长您必须在应用程序进入后台之前/之前执行一次操作的时间限制。这是Apple的官方文档

于 2012-06-19T12:30:28.733 回答
1

我不知道您如何准确处理数据下载。但是你可以看看ASIHTTPRequest如果您将编译器标志设置为-fno-objc-arc,它非常简单明了,并且可以与 ARC 一起使用。有了这个,你只需要使用

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setShouldContinueWhenAppEntersBackground:YES]; //For iOS 4.0 and up 

那行得通。

在这里你可以看到 ASIHTTPRequest 是如何工作的

希望能帮助到你!

于 2012-06-26T12:15:54.027 回答