2014-12-19 58 views
-1

我繼承了代碼庫的iOS的項目,我不知道這是什麼代碼的一點是:奇怪的Objective-C的線程

-(void) someMethod { 
     FMDatabaseQueue *dbQueue = self.db; 
    // unimportant stuff 
    [Async series:@[ 
     ^(successBlock success, failureBlock failure) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [dbQueue inDatabase:^(FMDatabase *db) { 
       // do database stuff 
      }]; 
     }); 
     }, 
     ^(successBlock success, failureBlock failure) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [dbQueue inDatabase:^(FMDatabase *db) { 
       // do other database stuff 
      }]; 
     }); 
     } 
    ];  
} 

是否有任何理由來編寫這樣的事情?

我的閱讀是,Asyncdispatch_async()回到主線程使得線程毫無意義。

+0

它並沒有使它變得毫無意義:異步可能會在後臺執行一些代碼,然後調用完成塊來在主線程中執行某些操作。無論Async的確需要花費大量的時間... – fabian789 2014-12-19 09:23:00

回答

1

代碼很奇怪,但不是因爲這個。方法+series可能會在後臺執行某些操作(網絡,計算,$ whatever),然後調用系列塊。在主線程上似乎沒有保證塊的執行。但+series無法知道,他們是否必須在主線程上執行。 (也許應該在後臺執行額外的計算,也許這些塊是並行執行的。)

因此,如果有什麼事情需要完成,那麼必須在主線程上完成,您需要另一個dispatch_async()

但是:當人們試圖用塊來做所有事情而不考慮需要時,你會得到這樣的星座。我不知道,爲什麼會發生這種情況,但是使用塊,許多編碼人員都試圖過度設計他們的代碼。

+0

amen to the but yes part:D – 2014-12-19 09:26:52

+0

更多信息:'Async'是作者將cocoapod描述爲:「一組用於處理異步塊的函數Objective-C的「。 '+ series'確保塊按照它們在數組中出現的順序執行。我不相信'異步'除了將塊異步排隊之外,什麼都不做。 – Pigglesworth 2014-12-19 17:54:35

+0

當我看到具有用於執行簡單獨立功能的類方法的代碼時,大部分時間都關閉了窗口。作者不知道Objective-C中仍然有函數嗎?類和類對象都不是模塊。他們是類型和對象。 – 2014-12-19 20:41:31