2015-10-03 40 views
0

使用解析我正在下載圖像,文本等並在表格視圖單元格中使用它們。但是,在刷新時(當指示器在導航欄中動畫時),我無法滾動或移動應用程序。就好像應用程序在表視圖刷新完成之前變得沒有響應。刷新時UITableView無法滾動

任何幫助,非常感謝。

+1

由於您正在同步下載,這需要時間,因此您將阻止該接口。在現實生活中,如果你這樣做的話,WatchDog程序會在你的用戶眼前死掉你的應用程序。做一些研究;這個問題已經遍佈Stack Overflow(解決方案也是如此)。 – matt

+0

如果您在主線程中執行這些操作,則會阻止UI,您應該在後臺線程中下載數據。 – flizana

回答

0

下面是一個關於如何分派到不同線程的簡單示例,下載圖像並在下載完成後返回主線程。

func downloadImageAndUpdateUI(){ 
    imageView?.image = nil 

    if let imageUrl = aValidUrl{ 
     //get image on another thread 
     let qos = Int(QOS_CLASS_BACKGROUND.rawValue) 
     dispatch_async(dispatch_get_global_queue(qos, 0), { 
      let imageData = NSData(contentsOfURL: imageUrl) 
      //get back to main thread 
      dispatch_async(dispatch_get_main_queue(), { 
       if imageUrl == self.requestedImageUrl { //making sure if this image is still needed (or if user havent moved on to something else) 
        if imageData != nil{ 
         self.imageView.image = UIImage(data: imageData!) 
        } 
       } 
      }) 
     }) 
    } 
} 
2

就像一些已經說過的評論,這是由於所謂的「阻塞主線程」。請參閱this偉大的教程,以瞭解更多關於Swift併發性的信息。您在Parse查詢中調用的方法WithBlockInBackground應該異步調用它。如果由於某種原因您仍然遇到問題,您應該將您的Parse查詢嵌套在dispatch_async區塊中。 Here's關於如何做到這一點的有用教程。

注意:總是做UI更新您的線程。如果你不這樣做,將會發生壞事。

+0

這會起作用,但是在使用findObjectsInBackgroundWithBlock時,似乎需要很長時間來加載任何東西。我應該只使用Swift代碼嗎? – exotue

+0

如果你正在下載圖片,那麼你是對的,這將需要一段時間,因爲每次下載新圖片時都不會刷新表格視圖。在這種情況下,你可以解決這個問題。雖然它沒有實現Parse,但我通過這個視頻瞭解到了,並且我高度建議:https://www.youtube.com/watch?v = gyluPwsPZ8c。原則將是相同的。 – rb612