gpt4 book ai didi

ios - 初始化后从未调用 Realm 通知

转载 作者:行者123 更新时间:2023-11-28 16:07:16 26 4
gpt4 key购买 nike

我有一个 UIView,我想在收到并解析来自后端的 json 后更新我的 ui。我使用通用 API 管理器,所以我的回调被调用得太快了。我认为我的解决方法和最佳实践是使用 Realm 通知 block 。通知 block 在 viewDidLoad 上被调用一次,但即使我在解析 json 后修改了 Realm 对象属性,也不会调用更新。 View 代码示例:

import SwiftyJson
import RealmSwift

var notificationToken: NotificationToken?
var article: Article?

if let result = Article.getLocalArticle(article!.id) {
// Observe Notifications on article from Network
notificationToken = result.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in
switch changes {
case .Initial:
break
case .Update:
print("updating")
self!.updateView()
case .Error(let error):
// An error occurred while opening the Realm file on the background worker thread
fatalError("\(error)")
break
}
}
}

Realm 对象的示例:

import SwiftyJson
import RealmSwift

public class Article : Object {
dynamic var liked = false
dynamic var id = String()

override public static func primaryKey() -> String? {
return "id"
}
// MARK: – Create article method

public class func article(json: JSON) -> Article? {

let article = Article()

if let id = json["id"].string {
article.id = id
}
if let liked = json["liked"].bool {
article.liked = liked
}
return article
}
// parse response Json for only one article after getting articleDetail
public class func parseUpdateArticleJson(json: JSON) {
//print(json)

do {
let realm = try Realm()
realm.beginWrite()
let article = self.article(json)
realm.add(article!, update: true)
try realm.commitWrite()

} catch {
print(error)
}
}


public class func getLocalArticle(articleId: String) -> Results<Article>? {
do {
let realm = try Realm()
let result = realm.objects(Article.self).filter("id == %@", articleId)
return result
} catch {
print(error)
}
return nil
}
}

在我的 View 中点击喜欢按钮后,我将操作发送到后端,这将更新我的 Realm 对象,将喜欢的属性设置为 true(如果为 true,则为 false)。预期的行为是通知 block 在我的 Realm 对象上的 like 属性更新时调用 updateView 方法。欢迎任何提示

最佳答案

好吧,问题在于您如何将对象添加到 Realm。当主键存在时,您只能在 realm.add(article!, update: true) 中将 update 设置为 true。 update 属性告诉 realm 根据它的主键智能地更新 Realm 对象(或者如果它不存在则添加它)。

查看此以获取更多信息: https://realm.io/docs/swift/latest/#creating-and-updating-objects-with-primary-keys


失败的原因是当您执行 realm.add(article!, update:true) 时 Realm 抛出异常并出现此错误:

Terminating app due to uncaught exception 'RLMException', reason: ''Article' does not have a primary key and can not be updated'

然后您的 do/catch block 会捕获错误。该对象永远不会被添加到 Realm ,通知 block 也永远不会收到通知。这就是我现在关于失败原因的假设。但是,我看到您正在打印错误,所以您可能已经发现了这一点。


因此,您可以通过执行以下操作为您的 Article 对象分配一个主键:

public class Article : Object {
dynamic var liked = false
dynamic var id = String()

override static func primaryKey() -> String? {
return "id"
}
}

或者,如果您不希望您的 id 属性成为主键(即唯一的),那么您可以通过以下方式添加对象:realm.add(article)。 update 的默认值为 false。这意味着它将始终添加(并且从不更新),即使存在具有相同主键的对象也是如此。

关于ios - 初始化后从未调用 Realm 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40109692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com