Сохранение данных Json в области в swift

#json #swift #realm

#json #swift #realm

Вопрос:

Я хочу сохранить данные json в Realm в swift. Но я получаю ошибку типа:

Завершение работы приложения из-за неперехваченного исключения ‘RLMException’,
причина: ‘Доступ к области из неправильного потока'»

В этой ситуации, что использовать — «GCD» или «operation»

Я добавляю сюда свой код

 func getDataFromServer(){ 

    let personData = Person()

    let headers = [
        "user_id": "1",
        "access_token": "5ae39568b47d3edf12345dc7ccddf519",
        ]

    let request = NSMutableURLRequest(url: NSURL(string: "http://prvy.in/sme/assgnment_ios/api/user/data")! as URL)
    request.httpMethod = "POST"
    request.allHTTPHeaderFields = headers

    let session = URLSession.shared
    let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
        if (error != nil) {

        } else {
            if let data = data {
                do{
                    guard let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary else{
                        return
                    }

                    if let resultArray = json["data"] as? NSArray{

                        for allData in resultArray {
                            if let resultData = allData as? NSDictionary{

                                let regdId = resultData[REGD_ID] as? String
                                if let firstName = resultData[FIRST_NAME] as? String{
                                    print(firstName)
                                    personData.firstName = firstName
                                }

                            self.saveReamData(personData)

                        }
                    }

                }catch{

                    print("error loading data")
                }

            }
        }
    })


    dataTask.resume()
}
  

Моя функция сохранения заключается в:

 func saveReamData(_ person: Person) {
    let backgroundQueue = DispatchQueue(label: ".realm", qos: .background)
    backgroundQueue.async {
        do {
            try self.realm?.write {
                self.realm?.add(person)
            }
        } catch  {
            print("error saving to realm")
        }
    }

}
  

Комментарии:

1. Почему вы создаете очередь отправки и пытаетесь сохранить в фоновом режиме? Что такое self.realm? Почему бы просто не использовать блок try, а затем добавить пользователя без использования фонового потока?

Ответ №1:

Если вы создали экземпляр Realm в основной очереди, вы можете использовать его только в основной очереди. В вашем коде вы пытаетесь записать данные в Realm в фоновой очереди, но вы создали экземпляр Realm в основной очереди.

Если вы хотите записать данные в Realm в фоновой очереди, используйте этот код из документации Realm:

 DispatchQueue(label: "background").async {
    autoreleasepool {
        let realm = try! Realm()
        guard let person = realm.resolve(personRef) else {
            return // person was deleted
        }
        try! realm.write {
            person.name = "Jane Doe"
        }
    }
}