Время от времени доступ к области из неправильного потока - PullRequest
0 голосов
/ 18 июня 2020

У меня есть эта функция

class func addCVals(_ criteres: [[AnyHashable: Any]], _ type: String) {
    DispatchQueue.global(qos: .background).async {
        autoreleasepool {
            if criteres.count > 0 {
                if let realm = DBTools.getRealm() {
                    do {
                        try realm.transaction {
                            let oldValues = CriteresVal.objects(in: realm, where: "type = '\(type)'")
                            if oldValues.count > 0 {
                                realm.deleteObjects(oldValues)
                            }
                            for critere in criteres {
                                let cval = CriteresVal(critere, type)
                                if let c = cval {
                                    realm.addOrUpdate(c)
                                }
                            }
                        }
                    } catch {
                        DebugTools.record(error: error)
                    }
                    realm.invalidate()
                }
            }
        }
    }
}

Запрос, который получает oldValues, иногда вызывает ошибку

Доступ к области из неправильного потока

Я не 'Не понимаю, почему, когда я получаю новое Realm раньше с такими строками:

if let realm = DBTools.getRealm()

Моя функция getRealm:

class func getRealm() -> RLMRealm? {
    if !AppPreference.lastAccount.elementsEqual("") {
        let config = RLMRealmConfiguration.default()
        do {
            return try RLMRealm(configuration: config)
        } catch {
            DebugTools.record(error: error)
            DispatchQueue.main.async {
               Notifier.showNotification("", NSLocalizedString("UNKNOWN_ERROR_DB", comment: ""), .warning)
            }
        }
    }

    return nil
}

CriteresVal - это RLMObject, который состоит из этого:

@objcMembers
public class CriteresVal: RLMObject {
   dynamic var cvalId: String?
   dynamic var type: String?
   dynamic var text: String?
   dynamic var compositeKey: String?

   override public class func primaryKey() -> String {
       return "compositeKey"
   }

   private func updatePrimaryKey() {
       self.compositeKey = "\(self.cvalId ?? "")/\(self.type ?? "")"
   }

   required init(_ cvalue: [AnyHashable: Any]?, _ type: String) {
       super.init()
    
       if let values = cvalue {
           if let cvalId = values["id"] as? String {
               self.cvalId = cvalId
           } else if let cvalId = values["id"] as? Int {
               self.cvalId = "\(cvalId)"
           }
           self.type = type
           if let text = values["text"] as? String {
               self.text = text
           }
       }
    
       updatePrimaryKey()
   }

   func generateDico() -> [String: Any] {
       var dicoSortie = [String: Any]()
       if let realm = self.realm {
           realm.refresh()
       }
    
       if let value = cvalId {
           dicoSortie["id"] = value
       }
       if let value = type {
           dicoSortie["type"] = value
       }
       if let value = text {
           dicoSortie["text"] = value
       }
    
       return dicoSortie
   }
}

CompositeKey - это первичный ключ, который включает cvalId и тип

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...