gpt4 book ai didi

ios - swift realm 在后台线程中插入数组在main中使用

转载 作者:行者123 更新时间:2023-11-28 15:20:10 25 4
gpt4 key购买 nike

我有一个通过 rest 响应接收到的对象数组,我想将其插入到 background 线程中的 Realm 数据库中,并在 ma​​in 线程中的 uicollectionview 中使用。一旦收到 rest 的响应,我就会调用回调函数并在后台线程中将数组插入 db。当我试图访问在后台插入的对象的主线程属性时出现异常(见下文),我认为这是因为对象尚未插入

Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread.

模型

class User : Object, Mappable {
dynamic var firstName: String?
dynamic var lastName: String?

required convenience init?(map: Map){
self.init()
}

func mapping(map: Map) {
firstName <- map["firstName"]
lastName <- map["lastName"]
}
}

插入后台线程...

DispatchQueue.global().async {
let realm = try! Realm()
try! realm.write {
realm.add(users)
}
}

在 UI 中呈现...

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! UserViewCell

let user = users[indexPath.row]
cell.firstName.text = user.firstName
cell.lastName.text = user.lastName
}

请注意,访问 firstName 或 lastName 时会发生异常。

请告诉我我做错了什么

最佳答案

最简单的解决方案是在主线程上创建对您的 Realm 实例的新引用,并使用新创建的引用从 Realm 中获取所有用户,因此您将从同一线程访问 Realm 。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! UserViewCell

let users = try! Realm().objects(User.self)
let user = users[indexPath.row]
cell.firstName.text = user.firstName
cell.lastName.text = user.lastName
}

另一种解决方案是使用 ThreadSafeReference对象传递 users从后台线程到主线程的数组。但是,您只能创建一个 ThreadSafeReference到您收藏的users如果 users 的类型是 ResultsList .请参阅下面的代码假设 users如果类型 Results<User> .

var usersRef: ThreadSafeReference<Results<User>>?
DispatchQueue.global().async {
autoreleasepool{
let realm = try! Realm()
try! realm.write {
realm.add(users)
}
usersRef = ThreadSafeReference(to: users)
}
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! UserViewCell

let realm = try! Realm()
guard let usersRef = usersRef, let users = realm.resolve(usersRef) else {return}
let user = users[indexPath.row]
cell.firstName.text = user.firstName
cell.lastName.text = user.lastName
}

关于ios - swift realm 在后台线程中插入数组在main中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46141444/

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