gpt4 book ai didi

swift - Realm 写入阻塞主线程

转载 作者:行者123 更新时间:2023-12-04 18:00:15 35 4
gpt4 key购买 nike

我在远程服务器上有一个 json 文件,我正在使用 dataTaskWithURL 从(36k 条记录)中获取数据。我返回的是生成的 JSON (SwiftyJSON)。下面是我的完成处理程序。

问题是,一旦我开始通过 Realm 创建滚动,我的所有其他回调都会停止执行,直到 Realm 提交触发。我想要的结果是这个任务简单地运行并在后台插入数据,允许用户在这个过程中继续他们快乐的方式。

一旦 realm.beginWrite() 触发,阻塞似乎就会发生。

RemoteAPI().getMetafile({JSONData, error -> Void in
if (JSONData != nil) {
do {
print("***** Loading realm")
let realm = try Realm()

realm.beginWrite()
for (_, subJSON) in JSONData {
realm.create(Meta.self, value: ["xxxxxx": subJSON["xxxxx"].int!, "xxxxx": subJSON["xxxxx"].stringValue, "xxxxx": subJSON["xxxxx"].stringValue, "xxxxxx": subJSON["xxxxxx"].int!, "xxxxxx": subJSON["xxxxx"].stringValue, "xxxxx": subJSON["xxxxx"].stringValue, "xxxxxx": subJSON["xxxxx"].stringValue], update: true)
}

try realm.commitWrite()

print("***** Finished loading realm")
} catch _ {}
} else {
print("api data fetch failed")
print(error)
}
})

在进行上述调用的同时,我还有另一个调用:

        RemoteAPI().getLatestActivityData({JSONData, error -> Void in
if (JSONData != nil) {
// do stuff

dispatch_async(dispatch_get_main_queue(), {
NSNotificationCenter.defaultCenter().postNotificationName("refreshTableView", object: nil)
})
}
})

这两个调用都是从应用委托(delegate)触发的。然而,问题是第二次调用中的观察者直到上面的第一次调用完成后才会触发。

最佳答案

如果你不想阻塞主线程,你应该在后台执行事务。

...

do {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let realm = try! Realm()

realm.beginWrite()

for (_, subJSON) in JSONData {
realm.create(Meta.self, value: [...], update: true)
}

try realm.commitWrite()
}
}
...

参见 Realm docs关于线程。

关于swift - Realm 写入阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36318793/

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