2011-10-03 57 views
1

我的iPAD應用程序中有4個UITableView。 我使用函數loadData加載它們上的數據,該函數在所有4個TableViewController.m文件中都有調用數據庫的函數。對ios數據庫的異步調用

所以,我會做這樣的

[aView loadData]; 
[bView loadData]; 
[cView loadData]; 
[dView loadData]; 

凡aView,bView,CVIEW和DVIEW是的的UITableView的視圖控制器的東西。

但是,數據庫調用是同步發生的,因此只有在從[aView loadData]函數檢索到數據之後,[bView loadData]函數纔會被調用,等等。

這會影響我的表現。

我想知道是否有一種方法可以異步調用數據庫/異步調用調用數據庫的函數。

這將是巨大的,如果有人可以幫助我了這一點。

回答

9

您可以使用GCD此:

-(void)loadList 
{ 
    // You ma do some UI stuff 
    [self.activityIndicator startAnimating]; // for example if you have an UIActivityIndicator to show while loading 

    // Then dispatch the fetching of the data from database on a separate/paralle queue asynchronously (non-blocking) 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // this is executed on the concurrent (parallel) queue, asynchronously 
     ... do your database requests, fill the model with the data 

     // then update your UI content. 
     // *Important*: Updating the UI must *always* be done on the main thread/queue! 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      [self.activityIndicator stopAnimating]; // for example 
      [self.tableView reloadData]; 
     }); 
    }); 
} 

然後,當你將調用loadList法,activityIndi​​cator將啓動動畫,和你的數據讀取過程將在一個單獨的隊列異步啓動,但loadList方法將立即返回(不等待dispatch_async中的塊完成執行,這就是dispatch_async的用途)。因此,您在每個視圖控制器中的所有實現都將立即執行(觸發異步獲取數據,但不會等待數據被檢索到)。一旦數據庫請求 - 在並行隊列中執行 - 已經在您的一個loadList方法中完成,將執行塊末尾的dispatch_sync(...)行,要求主隊列(主線程)執行一些代碼以刷新用戶界面並顯示新加載的數據。

+0

我編輯了我的答案並添加了一些細節。是的,你應該在你的每個'loadData'函數中添加這段代碼(或者你可以在調用者代碼中用'dispatch_async(...)'封裝'loadData'調用,但這不會很好並且可讀,並且它是ViewController觸發其相關視圖更新的責任,所以這是他們調用'[self.tableView reloadData]')的工作。 – AliSoftware

+0

非常感謝您給我一個詳細的解釋。我會試試這個.. – learner2010

+0

對於第二個問題:我的代碼中的主隊列使用'dispatch_get_main_queue()'函數檢索。閱讀[併發編程指南](http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1)欲瞭解更多有關Grand Central Dispatch(GCD)和調度隊列 – AliSoftware