2016-04-03 35 views
0

我想通過屏幕上的一組圖像,每個圖像之間有一個延遲。iOS:表視圖中的方法和數據被稱爲過早

func showImageAtIndex(index: Int) { 

    // all UI updates happen on the main queue 
    dispatch_async(dispatch_get_main_queue()) { 
     if (index) > self.images.count-1 { self.otherView.removeFromSuperview() 
      self.imageView?.removeFromSuperview() 
      return 
     } 


     self.imageView?.image = self.images[index] 


     let delayTime = 0.13 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delayTime * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {() -> Void in 

      self.showImageAtIndex(index + 1) 
     } 
    } 
在我的表視圖,單擊一個按鈕時,該方法showImageAtIndex被稱爲

func onAdd(sender: AnyObject) { 
self.temp=self.lotteryMachine.setPossibleCombinations(currentStandings) 
    //i took out the image view stuff bc its not necessary 
    self.navigationItem.rightBarButtonItem!.enabled = false 
    self.navigationItem.leftBarButtonItem!.enabled = false 
    self.showImageAtIndex(0) 
    tableView.reloadData() 
    self.navigationItem.rightBarButtonItem!.enabled = true 
    self.navigationItem.leftBarButtonItem!.enabled = true 
} 

我想知道的是,爲什麼在表中的數據首先被重新加載,然後將圖像被加載而不是其他方式。我想要發生的是圖像加載,然後數據在延遲後更新。

回答

1

您的showImageAtIndex函數使用dispatch_async,這意味着封閉內的所有內容都是異步發生的。

showImageAtIndex(0)的呼叫立即返回,並且對tableView.reloadData()的呼叫發生在dispatch_after閉包中的延遲碼被執行之前。

嘗試在dispatch_after關閉內呼叫showImageAtIndex(index + 1)後移動tableView.reloadData()

+0

我明白了爲什麼它會盡早重新載入數據,但是當我在dispatch_after段中移動數據時,它仍然會過早地重新載入數據。我認爲,因爲它是一個遞歸函數,它會在第一次調用之後重新加載數據(所顯示的第一個圖像),但是我希望在顯示所有圖像數組後加載它。因爲我知道數組的長度,我應該設置一個計數並每次遞增一次,如果它等於length-1,只需重新加載數據? –

+0

這應該工作,如果你正在檢查並重新加載dispatch_after內的數據。 –

+0

我結束了它在調度異步第一if語句,它工作正常 –