2017-09-09 33 views
0

雨燕3.1的Xcode 8.3.3境界通知射擊連續多次

我有得到我的應用程序建立在視圖控制器等領域通知,和我的應用程序啓動後,它在火災中4次一排。

let realm = try! Realm() 
notificationToken = realm.addNotificationBlock { notification, realm in 
    print("notif: \(notification)") <-- Logs 4 times in a split second 
    self.refreshData() 
} 

由於refreshData()方法就是刷新我的UI(其中包含被繪製圖表),我看到一個抖動/閃爍,因爲每個刷新命中。

有沒有辦法將這些通知聚合到一個單一的,所以我只得到一個單一的UI刷新?

+0

您應該首先確定觸發通知的內容。還要考慮只篩選相關的通知,以便它不會針對不相關的更改調用刷新。 –

回答

1

如果在Realm實例上設置通知塊,則每個寫入事務將收到通知。要將單個通知「聚合」爲單個通知,需要將單獨的寫入事務合併爲一個單獨的通知。

例如這段代碼觸發兩個通知:

try! realm.write { 
    realm.add(Person(value: ["name":"John"])) 
    realm.add(Person(value: ["name":"Chris"])) 
} 

try! realm.write { 
    realm.add(Person(value: ["name":"James"])) 
} 

儘管此代碼火災只有一個:

try! realm.write { 
    realm.add(Person(value: ["name":"John"])) 
    realm.add(Person(value: ["name":"Chris"])) 
    realm.add(Person(value: ["name":"James"])) 
} 

澄清基於@ bdash的評論,即使docs state that「每次涉及Realm的寫入事務被提交,無論寫入事務發生在哪個線程或進程上,通知處理程序將被觸發......「,實際上是通知來自根據通知代碼處理寫入事務所花費的時間,幾個寫入事務可能合併爲一個寫入事務。

+0

這不太對。可能會爲每個寫入事務觸發通知,但Realm也會將來自多個事務的更改合併爲單個通知。這完全取決於Realm通知代碼處理寫入事務期間所做更改的速度。 – bdash

+0

感謝您的澄清,我根據自己的測試得出的答案以及文檔說明的內容是什麼:「每次涉及該領域的寫入事務都被提交時,無論寫入事務發生在哪個線程或進程通知處理程序將被觸發:「。我想這些文檔需要根據您的意見進行一些澄清。 –