2014-07-17 73 views
2

我想在单独的线程后台运行6秒后的任务。我用这个代码。如何在后台线程中运行进程iOS

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
      [self getUnsyncNamesFromServer]; 
} 

我不确定这是否在后台线程中运行。我需要为此使用dispatch_async吗?这种情况最好的办法是什么?

+0

这将在主线程/ dispatch_get_main_queue运行块/ 6秒后与iOS登记在应用程序的后台运行状态。 – Laszlo

回答

7

dispatch_async是你想要的。在你使用的代码中,块内部的方法将在主队列中的6秒之后。

对于后台队列,可以使用如下:

__weak typeof(self) weakSelf = self; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{ 

    [weakSelf getUnsyncNamesFromServer]; 

}); 

更多参考,这里的GCD苹果文档:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/c/func/dispatch_async

+0

谢谢@dezinezync。我可以在dispatch_after块内使用dispatch_async吗? – Susitha

+0

dispatch_after与Apple文档中提到的是异步的。只需运行一个文本搜索。 如果你确实需要在dispatch_after块内调用dispatch_async,那也应该是好的。 – dezinezync

+0

由于'dispatch_after'已经是异步的,我不明白为什么在dispatch_after中调用'dispatch_async'将会是必要的 – user454322

1

您的代码将在主线程中运行,即没有背景,因为你正在使用dispatch_get_main_queue


而不是使用主队列,我会创建一个新的队列。该代码会是这样的:

dispatch_queue_t unsyncNamesQueue = 
    dispatch_queue_create("UnsyncNamesFromServer", DISPATCH_QUEUE_SERIAL); 
//.... 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC), 
       unsyncNamesQueue, ^{ 
        [weakSelf getUnsyncNamesFromServer]; 
       } 
); 


请务必仔细阅读https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

1

此行将把你的任务在主线程上不是单独的线程 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

摆在辅助线程你必须放置全局并发队列或创建自己的专用队列。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC),dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //Put on global queue to run seprate thread 
      [self getUnsyncNamesFromServer]; 
} 

我们在后台运行(当应用程序在后台状态下),你不需要在不同的线程,但如果您的应用程序占用太多的时间做对主线程比你应该换一个任务运行单独的线程,因为不建议阻塞主线程太多时间。

您的代码不会为你需要通过调用beginBackgroundTaskWithExpirationHandler:

// Declare property in your class 
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; 


-(void)yourfunction{ 

    self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 

    }]; 

__weak typeof(self) weakSelf = self; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC),dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //Put on global queue to run seprate thread 
      [weakSelf getUnsyncNamesFromServer]; 

      if (weakSelf.backgroundTask != UIBackgroundTaskInvalid) { 
       [[UIApplication sharedApplication] endBackgroundTask:weakSelf.backgroundTask]; 
       weakSelf.backgroundTask = UIBackgroundTaskInvalid; 
      } 
    }); 

}