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

时间:2018-08-05 22:34:03

标签: swift generics notifications realm

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

<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_divSea1"></div>

获得支持:

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 } } ... 函数成为 private ,但是在封装通知闭包时遇到了麻烦,在这种情况下,视图模型仍可以为任何getDatabase()设置它,而不必知道关于Realm的内部信息。

此事:

<T: Object>

对此:

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

1 个答案:

答案 0 :(得分:0)

似乎我能正常工作。

// 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()
    }