我在Swift项目上尝试Realm.io。对象的插入和更新非常简单,但是出现了一个问题:我无法捕获新的对象插入/更新通知。
我想要实现的很简单,我在Realm中保存了一个对象列表。在应用程序启动/刷新后,应用程序将从远程服务器请求新的对象列表,然后执行realm.add(objects, update:true)
(我将id
设置为对象的主键,以便相同的对象将不会重复),然后每当有新对象或任何现有对象更新时,都应通知我的应用程序的UI端。
我已尝试使用realm.addNotificationBlock(_:)
,但每次使用RLMRealmDidChangeNotification
事件都会调用它,即使没有新的对象/更新。
我如何实现这一目标?
编辑:代码示例
public class DataStorageManager {
var token : NotificationToken?
static let sharedInstance = DataStorageManager ()
public func saveListA(list: [A]?, realm:Realm) {
self.token = realm.addNotificationBlock({ (notification, realm) -> Void in
print("database changed")
})
if list?.count > 0 {
try! realm.write {
realm.add(list!, update:true)
}
}
}
}
答案 0 :(得分:1)
您应该只拨打addNotificationBlock
一次,而不是每次拨打saveListA
。因此,您可以将其移至DataStorageManager
init
方法。
但您写道,您希望在更新列表时更新您的用户界面,因此您可以直接将DataStorageManager
作为属性添加到NotificationToken
类,而不是在UIViewController
类中添加令牌。 1}}类并在视图控制器的addNotificationBlock
方法中调用viewDidLoad
。然后,您可以直接更新通知块中的UI。
编辑:
如果您只想在更新某些数据时更新您的UI,则无法使用Realm的通知系统(每次更改任何数据时都会发送通知)。
您可以执行以下某项操作
NSNotification
。因此,在您的情况下,您可以在NSNotification
中每次更改列表时发送saveListA
。然后,您将视图控制器注册为该通知的观察者,并在收到该通知时更新您的UI。答案 1 :(得分:0)
据我了解,您应该在想要保存它们的地方(如数据管理器或视图控制器)获取所需的对象,获取Results
对象并订阅此Results
更改。
请参阅https://realm.io/docs/swift/latest/#collection-notifications。
只要您持有该通知令牌,对象的更改位置就无关紧要。
缺点是,目前"修改"数组总是包括每个"触及"元素,无论是否有任何变化。它被认为是一个错误,但自8月以来没有任何进展#17; 17。 https://github.com/realm/realm-cocoa/issues/3489
目前,我在收到通知后手动比较修改。