我的视图模型当前包含以下代码:
<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] ...
答案 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()
}