简体   繁体   English

无法将解析的数据保存到URLSession到Core Data上下文中(iOS 10,Swift 3)

[英]Can't save parsed data into URLSession to Core Data context (iOS 10, Swift 3)

It is a part of a program for get weather information from some site. 它是从某个站点获取天气信息的程序的一部分。 Into the program I'm using singleton for get Core Data context. 进入程序,我使用单例获取Core Data上下文。 AirportsICAO and AirportsData are Core Data subclasses. AirportsICAO和AirportsData是核心数据子类。 This function must parse the page and save all data to Core Data context, it work fine when parse data, but throwing the error when trying to save result to database. 此函数必须解析页面并将所有数据保存到Core Data上下文中,在解析数据时可以正常工作,但是在尝试将结果保存到数据库时抛出错误。 How to fix it? 如何解决? Any ideas. 有任何想法吗。

2017-03-16 23:56:21.197036 Weather App[3603:81353] [Common] _BSMachError: port 700f; 2017-03-16 23:56:21.197036 Weather App [3603:81353] [通用] _BSMachError:端口700f; (os/kern) invalid capability (0x14) "Unable to insert COPY_SEND" (os / kern)功能无效(0x14)“无法插入COPY_SEND”

2017-03-16 23:56:21.197265 Weather App[3603:81353] [Common] _BSMachError: port 700f; 2017-03-16 23:56:21.197265 Weather App [3603:81353] [通用] _BSMachError:端口700f; (os/kern) invalid name (0xf) "Unable to deallocate send right" (os / kern)无效名称(0xf)“无法取消分配发送权限”

    func getData(forICAO icaoCode: String) -> Bool {

    let config = URLSessionConfiguration.default
    let apiKey = "zzzzzzzzz-zzzz-zzzz-zzzz-zzzzzz"
    let url = URL(string: "https://somesite.com/current-conditions-list?api_key=" + apiKey + "&airports=" + icaoCode + "&states=&format=json")
    let session = URLSession(configuration: config)


    let task = session.dataTask(with: url!) { (data, responce, error) in



        if error == nil && data != nil {
            if let parsedDataArray = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! Array<Any> {
                if let parsedData = parsedDataArray[0] as? Dictionary<String, Any> {
                    guard let airport = parsedData["airport"] as? String else { return }
                    guard let airport_name = parsedData["airport_name"] as? String else { return }
                    let updatedByUser = Date()

                    // Core Data
                        let context = CoreDataManager.instance.persistentContainer.viewContext
                        let entityForAirportICAO = NSEntityDescription.entity(forEntityName: "AirportsData", in: context)
                        let airportICAO = AirportsICAO(entity: entityForAirportICAO!, insertInto: context)

                        airportICAO.airport = airport
                        airportICAO.airport_name = airport_name
                        airportICAO.updatedByUser = updatedByUser

                        try! context.save()
                }
            }
        }
    }

    task.resume()
    return true
}

The completion handler block for URLSession.dataTask(with:completionHandler:) is called on a background queue, but you're accessing the view context from that block. 在后台队列上调用URLSession.dataTask(with:completionHandler:)的完成处理程序块,但是您正在从该块访问视图上下文。 The view context should only be accessed from the main thread. 视图上下文只能从主线程访问。

Instead, you should use a background task: 相反,您应该使用后台任务:

CoreDataManager.instance.persistentContainer.performBackgroundTask() { context in

    let entityForAirportICAO = NSEntityDescription.entity(forEntityName: "AirportsData", in: context)
    let airportICAO = AirportsICAO(entity: entityForAirportICAO!, insertInto: context)

    airportICAO.airport = airport
    airportICAO.airport_name = airport_name
    airportICAO.updatedByUser = updatedByUser

    try! context.save()
}

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

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