2014-10-02 50 views
2

我在http請求中的回調函數內調用了這段代碼。 http請求是一個用於更新應用程序數據的get。因此,對於某些VC,我需要重新加載視圖,實例的回調已完成,更新了Core Data中的所有內容。從異步函數重新載入UITable調用

這是我目前正在使用的代碼塊(在回調函數中調用)。

func reloadTopMost(){ 
    var topMost = topMostContoller() as UIViewController 
    if topMost.isKindOfClass(SecondViewController){ 
     topMost.reloadInputViews() 

     var svc = topMost as SecondViewController 
     svc.studentTable.reloadData() 
     svc.studentTable.setNeedsDisplay() 
     svc.viewDidLoad() 
     svc.reloadInputViews() 
    }else if topMost.isKindOfClass(ThirdViewController){ 
     topMost.reloadInputViews() 

     var tvc = topMost as ThirdViewController 
     tvc.inClassTable.reloadData() 
     tvc.inClassTable.setNeedsDisplay() 
     tvc.viewDidLoad() 
     tvc.reloadInputViews() 
    } 
} 

正如你可以看到我已經試過reloadData(),setNeedsDisplay(),viewDidLoad中和reloadInputViews()。想法,我從問題的答案中獲得如this之一。我確信if語句是爲每個vc類傳遞的。所以我不知道爲什麼這不是重新加載VC /表。這是因爲它在異步函數中被調用嗎?

回答

5

這是因爲它在異步函數中被調用嗎?

這可能是問題所在。回調在後臺線程中調用的可能性很大。 UIKit不是線程安全的,涉及它的所有內容都必須在主線程上運行。確保reloadTopMost()在主線程上運行應解決問題。您可以使用dispatch_async()做到這一點:

// In your callback: 
dispatch_async(dispatch_get_main_queue(), { 
    self.reloadTopMost() 
}) 

請立即注意dispatch_async()回報。如果您需要等待重新加載完成,則可以使用dispatch_sync()