swift - 后台线程中的快速领域然后应用程序崩溃
问题描述
它似乎!我已经尝试了一切,但我做不到。
我每 2 分钟从数据库中获取数据,并在 API 中发布数据。我的应用每 2 分钟就会卡住几秒钟。原因是当我从数据库中获取数据时,时间应用程序被卡住了。我必须在后台做。
这是我的代码正在运行,但应用程序卡住了
func getObjects(type: Object.Type) -> Results<Object>? {
//... *****************************
//...code is working but app is stuck
return realm.objects(type)
}
if let list = realm.getObjects(type: AssignedCalendars.self)?.filter("isRemove == \(true) AND isSynced == \(false)").toArray(ofType: AssignedCalendars.self) {
if list.count > 0 {
list.forEach({ (calendar) in
let calendar_json = [APIKey.event_id : calendar.event_id, APIKey.offlineId: calendar.offlineId, APIKey.calendar_id: calendar.calendar_id.toArray(ofType: Int.self)] as [String: Any]
removedCalendars.append(calendar_json)
})
}
offlineRemovedCalendars.append(contentsOf: list)
eventData[APIKey.calendar_removelist] = removedCalendars
}
试一试。尝试在后台运行代码我必须尝试使用调度队列
func getObjects(type: Object.Type) -> Results<Object>? {
//... *****************************
//...code is working but app is stuck
return realm.objects(type)
}
DispatchQueue.main.async(execute: {
if let list = realm.getObjects(type: AssignedCalendars.self)?.filter("isRemove == \(true) AND isSynced == \(false)").toArray(ofType: AssignedCalendars.self) {
DispatchQueue.global().async {
if list.count > 0 {
list.forEach({ (calendar) in
let calendar_json = [APIKey.event_id : calendar.event_id, APIKey.offlineId: calendar.offlineId, APIKey.calendar_id: calendar.calendar_id.toArray(ofType: Int.self)] as [String: Any]
removedCalendars.append(calendar_json)
})
}
offlineRemovedCalendars.append(contentsOf: list)
eventData[APIKey.calendar_removelist] = removedCalendars
} //.. end bac que
}
})//... main que
尝试 2. 在后台使用领域但我不知道如何使用这种方法
extension Realm {
func writeAsync<T : ThreadConfined>(obj: T, errorHandler: @escaping ((_ error : Swift.Error) -> Void) = { _ in return }, block: @escaping ((Realm, T?) -> Void)) {
let wrappedObj = ThreadSafeReference(to: obj)
let config = self.configuration
DispatchQueue(label: "background").async {
autoreleasepool {
do {
let realm = try Realm(configuration: config)
let obj = realm.resolve(wrappedObj)
try realm.write {
block(realm, obj)
}
}
catch {
errorHandler(error)
}
}
}
}
}
尝试 3。找到一种解决方案,但它不起作用。它没有以一种好的方式执行。它的 ADD 方法,而不是 get
var usersRef: ThreadSafeReference<Results<User>>?
DispatchQueue.global().async {
autoreleasepool{
let realm = try! Realm()
try! realm.write {
realm.add(users)
}
usersRef = ThreadSafeReference(to: users)
}
}
解决方案
TRY 1 不起作用,因为您无法Realm
在线程之间传递对象引用。你必须做的:
var realmConig: Realm.Configuration = // your config - store it globally
// Now fetch the data
DispatchQueue(label: "background").async {
// Define a new Realm object inside async thread
let realm = try! Realm(configuration: realmConfig)
// now fetch your objects
let objects = realm.objects(Object.self)
// From here you can perform actions with the objects
// i.e. transform if to json format and submit via API
}
警告:为了objects
在后台线程之外使用,您必须先将它们转换为数组ThreadSafeReference
。但据我了解您的目标,您的特定情况不需要它。
推荐阅读
- dataset - huggingface_load_dataset() 函数 quit() 没有完成
- jupyter-notebook - 更改 jupyter 内核仍然错误地导入不存在的包
- mongodb - 使用 PyMongo 连接到集群失败
- laravel - 带有 vue/vue 路由器的 Laravel 路由
- c++ - 未获得所需的输出 C++
- django - Django Elasticsearch dsl drf OR 查询
- vba - 发送带有多个附件的电子邮件
- javascript - Discord.js for 循环行为异常
- c# - 重新映射 JSON Schema 中的无效属性名称
- node.js - http服务器中的NodeJS err-ssl-protocol-error