2016-08-18 52 views
3

在閱讀了許多關於並行和併發的文章後,我仍然混淆了獲取數據的正確方法。例如,在我的項目中,我有一個用於獲取數據的按鈕。我的代碼如下所示。dispatch_async vs dispatch_sync獲取數據。 Swift

var array = [Int]() 
func fetchData() { 

    .... 
    .... 
    response(objects: [object], error: NSError?) { 
     for object in objects { 
      array.append(object.number) // assume object.number return an Int 
     } 

     // confuse here. Should I use async here because I am worry if the user 
     // click the fetchData button more than one time, the append and make 
     // function will be happened at the same time. Or, is there anything I 
     // made a wrong assumption? I guess I need a serial operation. Correct? 

     dispatch_async(dispatch_get_main_queue()) { 
      makeCollectionView() // using the data in array 
     } 
    } 
} 

UPDATE

嘗試運行這段代碼。 10000-19999在0-9999之後運行。看起來第二個異步不會停止第一個異步來處理它的操作。

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    for i in 0 ..< 10000 { 
     print(i) 
    } 
}) 
dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    for i in 10000 ..< 20000 { 
     print(i) 
    } 
}) 

回答

0

GCD提供執行任務的隊列。隊列可以有兩種類型 - 併發系列。在串行隊列任務中按時按順序執行一個(按FIFO順序),並行排隊若干個任務。

爲了防止用戶在抓取任務正在運行時抓取數據,此時不需要提交抓取任務。無論是什麼類型的隊列 - 併發或串行。

var array = [Int]() 
var isFethingData = false 

func fetchData() { 
    if !isFethingData { 
     isFethingData = true 
     dispatch_async(queueForFetchData) { 
      … 
      response(objects: [object], error: NSError?) { 
       for object in objects { 
        array.append(object.number) 
       } 

       dispatch_async(dispatch_get_main_queue()) { 
        makeCollectionView() 
       } 
       isFethingData = false 
      } 
    } 
} 

dispatch_asyncdispatch_sync是它提交任務排隊功能。區別在於dispatch_async在提交任務後立即返回,但dispatch_sync等待,直到任務完成。例如:

print("\(NSDate()) qq") 
dispatch_sync(queue) { 
    // … some code which runs for 10 minutes. 
    print("\(NSDate()) ee") 
} 
print("\(NSDate()) ww") 
// 2016-08-18 16:02:00 qq 
// 2016-08-18 16:12:00 ee 
// 2016-08-18 16:12:00 ww 


print("\(NSDate()) qq") 
dispatch_async(queue) { 
    // … some code which runs for 10 minutes. 
    print("\(NSDate()) ee") 
} 
print("\(NSDate()) ww") 
// 2016-08-18 16:02:00 qq 
// 2016-08-18 16:02:00 ww 
// 2016-08-18 16:12:00 ee 
+0

精彩的答案來清除我的困惑。謝謝 –

+0

Opps。還有一個問題。如果我調用dispatch_async(queue){makeCollectionView()}兩次,第二個makeCollectionView將在第一個或第二個會立即停止並立即運行後立即運行?如果它會立即停止第一個,是否有任何功能我可以把它作爲隊列中的第一個任務? –

+0

更新了一些信息 –

1

爲了提高性能,任何涉及UI的內容都應該在主線程上運行。所以基本上:

dispatch_async(dispatch_get_main_queue()) { 
     //anything that involves UI 
    }