2016-01-20 60 views
0

我有一個完成處理程序的功能,可以從YouTube的API下載視頻。讓我的功能在獲取信息的同時阻止功能

第一次運行時,效果很好。在後續運行中,由於視頻存儲在設備中,並且在更新視頻陣列之前顯示,我希望用戶能夠在更新(如果需要)時與表進行交互。但是,在下載信息時,與桌面或應用程序的交互被阻止。

我想這與Grand Central Dispatch有關,但我不知道如何使用它。

Networking().getPlaylists() { (result: String) ->() in 
     self.activityView.removeFromSuperview() 
     print("should reload data") 
     self.tableView.reloadData() 
     } 
    } 

有人能給我一些指點嗎?

+1

如果在查詢運行時UI被阻塞,問題無疑將停留在「Network」實現中。你應該分享它如何執行請求。但是如果你在'Networking'內使用'NSURLSession'(並且不要做任何象信號量或者等待操作來完成),它確實不應該阻塞。 – Rob

回答

1

它實際上不是Alamofire,它阻止了我的用戶界面(它實際上是一個異步函數),但它在我解析時是SwiftyJSON。我通過dispatching_async解決了這個問題,但通過解析部分解決了問題,而不是函數的其餘部分!

更多,請參閱:Alamofire http json request block ui

謝謝!

1

理想的情況下你的網絡代碼將執行在後臺線程:

func getPlaylists() { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     //Do network stuff 
    }) 
} 

,但你打電話給你的完成也之前,請確保你的UI邏輯像更新的tableview之前,你翻轉回主線程:

func getPlaylists() { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     //Do network stuff 
     dispatch_async(dispatch_get_main_queue()) { 
      completion(results) 
     } 

    }) 
} 
+0

視圖仍然似乎暫停,而它獲取信息!還有什麼我可能做錯了嗎? –