2016-01-04 124 views
2

我有兩種方法作爲loadTopicPostsFromDB和loadTopicPosts。在loadTopicPostsFromDB方法中,我正在更新名爲strLastTimeStamp的全局NSString的值,該值應在loadTopicPosts中使用。因此,我想首先執行loadTopicPostsFromDB,並在完成後(全局字符串更新),我想執行loadTopicPosts方法。 這就是我做到的。但是,當前loadTopicPosts方法在更新全局strLastTimeStamp之前執行,所以總是出現錯誤的strLastTimeStamp。完成另一種方法後執行方法的問題 - iOS

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
     dispatch_group_t group = dispatch_group_create(); 

     dispatch_group_async(group, queue, ^{ 
      [self performSelectorOnMainThread:@selector(loadTopicPostsFromDB) withObject:nil waitUntilDone:NO]; 
     }); 

     dispatch_group_notify(group, queue, ^{ 
      NSLog(@"LoadDBCompleted"); 

      [self loadTopicPosts]; 
     }); 

我該怎麼做,請告訴我這個實現有什麼問題。

+0

你嘗試用waitUntilDone寫:YES ??? – DilumN

+0

爲什麼不從loadTopicPostsFromDB的最後一行執行loadTopicPosts方法? – DilumN

+0

@DilumN這是無法完成的,因爲我還有其他一些場景需要考慮。 – sajaz

回答

0

performSelectorOnMainThread:iOS將任務放入隊列後立即完成。呼叫返回時,選擇器很可能不會開始運行。實際上,你根本不應該使用performSelectorOnMainThread - 這個函數在Swift中是不可用的,理由很多。該解決方案是一個容易得多(自己解決的問題):

dispatch_async (dispatch_get_main_queue(), ^{ 
    [self loadTopicsFromDB]; 
    [self loadTopicPosts]; 
}); 

你可能想,雖然在後臺線程執行loadTopicsFromDB。

0

當您使用網絡連接進行某些操作時,我建議您使用blocks來處理呼叫的端點。

這是很簡單的在此代碼

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [self loadTopicsFromDB: ^(BOOL success, NSError *error) { 
     [self loadTopicPosts]; 
    }]; 
}); 
相關問題