首页 > 解决方案 > 后台线程中的快速领域然后应用程序崩溃

问题描述

它似乎!我已经尝试了一切,但我做不到。

我每 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)
    }
}

标签: swiftbackgroundrealm

解决方案


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。但据我了解您的目标,您的特定情况不需要它。


推荐阅读