2014-07-17 49 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; 
      } 
    }); 

}