2015-10-29 64 views
2

我使用Realm結果對象Result<AnObject>作爲uitableview的數據源。在不同的視圖控制器中有一些延遲的API調用會加載更多的AnObject對象。我想要的是當我的數據源被更新以更新表格視圖時得到通知。 我做了一些searchs,知道我需要使用KVO,但我找不到任何例如如何與realm.My代碼中使用它是像下面:Realm Swift結果更新時如何得到通知

class myViewController: UIViewController, UITableViewDatasource { 
    let realm = try! Realm() 
    override func viewDidLoad() { 
     super.ViewDidLoad() 
     var datasource = realm.objects(AnObject.self) 
     // I need to some how observe the change of datasource 
    } 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return datasource.count 
    } 
    ... 
} 

更新 我試着在它工作之前使用realm.addNotificationBlock(與@joern的答案中的方法相同),但是當任何領域對象不僅更新datasouce類型時,該塊將運行。它會重新加載太多的非偶然時間表。

更新2 我的應用程序包含在上半FSCalenar查看和鏈接到EventsViewController其對事件的tableview下半部的容器CalendarViewController。 我有很多事件需要很長時間才能從API中獲得。所以我打了20個電話給他們,他們每個人都得到一些事件。並在NSOperationQueue中添加所有呼叫操作,然後根據我需要首先加載的操作優先級設置操作優先級。因此每個API調用在完成時更新數據源對象。我需要事件tableview來重新表達。 API調用發生在已由CalendarViewController調用的APIManager類方法中

回答

9

您不必使用KVO。您可以使用Realm的通知功能:

每次提交寫入事務時,領土實例都會向其他 線程上的其他實例發送通知。只要你保持一個強引用此令牌,你會得到通知

let token = realm.addNotificationBlock { notification, realm in 
    let realm = try! Realm() 
    self.datasource = realm.objects(AnObject.self) 
    self.tableView.reloadData() 
} 

:這些 通知可以通過註冊一個塊進行觀察。

更新

如果你不希望使用域的通知,你可以發佈你自己的通知,每當一個API調用返回的結果,然後相應地重新加載您的表視圖:

添加您EventViewController到默認NSNotificationCenter,並添加一個動作:

override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("didReceiveReloadNotification:"), name: "RELOAD_NOTIFICATION", object: nil) 
    ... 
} 

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

func didReceiveReloadNotification(notification: NSNotification) { 
    let realm = try! Realm() 
    datasource = realm.objects(AnObject.self) 
    tableView.reloadData() 
} 

然後,只要您的API請求操作的一個完成發佈通知:

dispatch_async(dispatch_get_main_queue()) {() -> Void in 
    NSNotificationCenter.defaultCenter().postNotificationName("RELOAD_NOTIFICATION", object: nil) 
} 
+0

謝謝你的快速回答。在它工作之前,我嘗試了這種方式,但是當任何領域對象不僅更新datasouce類型時,該塊將運行。它會重新加載太多的非偶然時間表。 – Ismail

+1

你說得對。你可以添加更多關於你的應用程序結構的信息嗎?你在哪個類中更改數據源對象? – joern

+0

我已根據您的評論更新了該問題。 – Ismail