Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 领域:在新插入/更新对象时获得通知_Ios_Swift_Realm - Fatal编程技术网

Ios 领域:在新插入/更新对象时获得通知

Ios 领域:在新插入/更新对象时获得通知,ios,swift,realm,Ios,Swift,Realm,我正在我的Swift项目中试用Realm.io。对象的插入和更新非常简单,但这里出现了一个问题:我无法捕获新的对象插入/更新通知 我想要实现的很简单,我在领域中保存一个对象列表。在应用程序启动/刷新时,应用程序将从远程服务器请求一个新的对象列表,然后执行realm.add(objects,update:true)(我已将id设置为对象的主键,以便不会重复相同的对象),然后每当有新对象时,应通知我的应用程序的UI端,或已更新任何现有对象 我尝试过使用realm.addNotificationBlo

我正在我的Swift项目中试用Realm.io。对象的插入和更新非常简单,但这里出现了一个问题:我无法捕获新的对象插入/更新通知

我想要实现的很简单,我在领域中保存一个对象列表。在应用程序启动/刷新时,应用程序将从远程服务器请求一个新的对象列表,然后执行
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)
        }
    }
  }    
}

您应该只调用一次
addNotificationBlock
,而不是每次调用
saveListA
。因此,您可以将其移动到DataStorageManager的
init
方法

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

编辑:

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

您可以执行以下操作之一

  • 在领域对象上使用KVO。这一点在本节中进行了描述
  • 每当需要刷新UI的数据更新时,发送您自己的
    NSNotification
    。因此,在您的情况下,每次在
    saveListA
    中更改列表时,您都可以发送
    NSNotification
    。然后将视图控制器注册为该通知的观察者,并在收到该通知时更新UI

  • 据我所知,您应该将所需对象提取到您想要保存它们的位置(如数据管理器或视图控制器),获取
    结果
    对象并订阅此
    结果
    更改

    请参阅

    只要您持有通知令牌,对象将在何处更改并不重要

    缺点是,当前的“修改”数组总是包含每个“接触”的元素,不管是否有任何更改。这被认为是一个错误,但自8月17日以来没有任何进展。


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

    您使用Objective-C版本的Realm有什么特殊原因吗?另外,您目前所拥有的一些代码示例也会有所帮助。@caseynolan我实际上使用的是一个swift版本的Realm。如果前面的方法定义使您感到困惑,很抱歉。我已经在编辑中添加了代码示例。@tropicalfish不幸的是,这样的通知还不受支持。我们将在未来的版本中添加细粒度通知。最常见的请求功能是查询的变更列表通知。一旦我们支持此功能,您就可以在RLMArray上注册通知,以获取在事务期间添加、删除或更改位置的对象列表。感谢您的建议,我们将跟踪此问题。我尝试过这样做,但我发现每次数据库发生更改时都会触发通知,即saveListB和saveListC上的更改。似乎没有办法知道哪些数据被更改了。也许自建的通知系统是一种方式。是的,不幸的是,这就是通知系统的构建方式。每次执行写入操作时,它都会触发通知。无论更改了什么数据。有关如何仅在某些数据更新时获得通知的两条建议,请参见我的更新答案。