swift - 如何将 Realm 通知抽象为带有闭包的通用结构?

标签 swift generics notifications realm

我的 View 模型当前包含以下代码:

private let project = RLMProject()
var projectToken: NotificationToken? = nil

projectToken = project.getDatabase()?.objects(RLMProject.self).observe { changes in ...

支持:

final class RLMProject: Object, Decodable, DatabaseLayer { ... 
    typealias T = RLMProject
}

protocol DatabaseLayer {
    associatedtype T: Object

    func getDatabase() -> Realm?
}

extension DatabaseLayer {
    func getDatabase() -> Realm? {
        do {
            return try Realm(fileURL: userRealmFile)
        } catch let error {
            DDLogError("Database error: \(error)")
            return nil
        }
    }
...

我想做getDatabase()函数 private 但在封装通知闭包时遇到了麻烦, View 模型仍然可以为任何 <T: Object> 设置它,无需了解 Realm 的任何内部结构。

来自此的一些内容:

projectToken = project.getDatabase()?.objects(RLMProject.self).observe { [unowned self] ...

对此:

projectToken = project.setupNotificationToken { changes in ...

最佳答案

看来我已经成功了。

// Setup to observe Realm `CollectionChange` notifications
func setupNotificationToken(for observer: AnyObject, _ block: @escaping () -> Void) -> NotificationToken? {
    if let database = self.getDatabase() {
        return database.objects(T.self).observe { [weak observer] (changes: RealmCollectionChange) in
            if observer != nil {
                DDLogDebug("NotificationToken triggered on: \(observer!) for object: \(T.self)")
            }
            block()
        }
    } else {
        return nil
    }
}

示例:

projectToken = project.setupNotificationToken(for: self) { [unowned self] in
    self.updateVC()
    }

关于swift - 如何将 Realm 通知抽象为带有闭包的通用结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51698740/

相关文章:

generics - 类型推断在具有静态成员约束的泛型类型上失败

process - 在 Windows 和 Linux 中如何在进程终止时收到通知?

ios - for循环中的范围是什么类型?

swift - 访问扩展中的结构时的保护级别问题

generics - Swift - 获取泛型类型的类

macos - 如何处理有关核心数据、共享首选项和通知的 Mac OS X Helper/Main 应用程序架构?

ios - 使用两个委托(delegate)

ios - 更新标签花费的时间太长(快速)

swift - 如何设置自定义类型的粘贴板属性列表 - NSPasteboard/Swift

c# - 如何使用弱类型参数调用泛型方法