简体   繁体   English

在swift中保存Realm中的Json数据

[英]Saving Json data in Realm in swift

I want to save json data in Realm in swift . 我想在swift中保存Realm中的json数据。 But I am getting error like: 但我得到的错误如下:

Terminating app due to uncaught exception 'RLMException', 由于未捕获的异常'RLMException'而终止应用,
reason: 'Realm accessed from incorrect thread'" 原因:'领域从错误的线程访问'“

In this situation what to use - "GCD" or "operation" 在这种情况下使用什么 - “GCD”或“操作”

I am adding my code here 我在这里添加我的代码

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()
}

My save function is: 我的保存功能是:

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")
        }
    }

}

If you created Realm instance in the main queue you can use it only on the main queue. 如果您在主队列中创建了Realm实例,则只能在主队列中使用它。 In your code you are trying to write data to Realm in the background queue but you have created Realm instance in the main queue. 在您的代码中,您尝试在后台队列中将数据写入Realm,但您已在主队列中创建了Realm实例。

If you want to write data to Realm in the background queue use this code from Realm documentation: 如果要在后台队列中将数据写入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"
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM