2013-03-02 66 views
0

我有一个需求,我需要在应用程序进入后台状态时创建并启动一个线程。创建的线程的功能是从本地数据库获取数据并上传到服务器,并且我不需要在UI上进行任何更新。我的问题是:当iOS应用程序进入后台状态时启动线程

  1. 我究竟应该在哪里创建线程 - 无论是在applicationWillResignActive方法或applicationDidEnterBackground
  2. 这是创建线程的最佳方式 - way或GCD或Posix Way?

这个事情我已经试过

  1. 我已经工作在Android上,所以我知道我能做到这一点的场景,但我是新来的iOS,所以我变得有点糊涂了开始。
  2. 我刚刚尝试过使用NSThread概念,但它不起作用。下面是代码,我写信给我所知:

    - (void)applicationWillResignActive:(UIApplication *)application { 
        [NSThread detachNewThreadSelector:@selector(FetchReportFromDBAndUpload) toTarget:self withObject:nil]; 
    } 
    
    - (void)FetchReportFromDBAndUpload { 
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
        //Check for internet connection and fetch data from DB and upload to server 
        [pool release]; 
    } 
    

是创建线程的这种正确的方法,或者我需要做一些改变?如果不是,请指导我如何实现这一目标。在此先感谢

回答

1

您必须从AppDelegate的applicationDidEnterBackground:方法调用UIApplication类的beginBackgroundTaskWithExpirationHandler:方法。此方法将您的任务标记为后台任务,以便系统在应用程序进入后台状态时不会终止它。 (请注意,与VoiceIP无关,播放音乐,GPS跟踪的后台任务仍然受限于大约10分钟的后台执行时间,即它们不会永远运行。)

下面是更详细的信息和一个代码示例:http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

+0

谢谢Daniel,你能解释我多一点吗?你能给我一个代码片段吗? – RockandRoll 2013-03-02 13:21:28

+0

@SunilHavnur在调度长时间运行的任务之前,您需要从'applicationDidEnterBackground:'方法调用'beginBackgroundTaskWithExpirationHandler:'。请参阅我链接到的文章中的清单3-3。 – 2013-03-02 13:28:09

+0

好的,谢谢..我明白了.. – RockandRoll 2013-03-02 13:30:30

相关问题