领域:收到关于对象

时间:2016-01-16 09:34:37

标签: ios swift realm

我在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)
        }
    }
  }    
}

2 个答案:

答案 0 :(得分:1)

您应该只拨打addNotificationBlock一次,而不是每次拨打saveListA。因此,您可以将其移至DataStorageManager init方法。

但您写道,您希望在更新列表时更新您的用户界面,因此您可以直接将DataStorageManager作为属性添加到NotificationToken类,而不是在UIViewController类中添加令牌。 1}}类并在视图控制器的addNotificationBlock方法中调用viewDidLoad。然后,您可以直接更新通知块中的UI。

编辑:

如果您只想在更新某些数据时更新您的UI,则无法使用Realm的通知系统(每次更改任何数据时都会发送通知)。

您可以执行以下某项操作

  1. 在Realm对象上使用KVO。这在Realm Docs
  2. 中有所描述
  3. 每当需要刷新UI的数据更新时发送您自己的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

目前,我在收到通知后手动比较修改。