【问题标题】:Can't save parsed data into URLSession to Core Data context (iOS 10, Swift 3)无法将解析的数据保存到 URLSession 到 Core Data 上下文(iOS 10、Swift 3)
【发布时间】:2017-08-08 06:18:02
【问题描述】:

它是从某个站点获取天气信息的程序的一部分。 进入我使用单例获取核心数据上下文的程序。 AirportsICAO 和 AirportsData 是核心数据子类。 此函数必须解析页面并将所有数据保存到 Core Data 上下文中,它在解析数据时工作正常,但在尝试将结果保存到数据库时抛出错误。如何解决?有任何想法吗。

2017-03-16 23:56:21.197036 Weather App[3603:81353] [Common] _BSMachError: port 700f; (os/kern) 无效能力 (0x14) “无法插入 COPY_SEND”

2017-03-16 23:56:21.197265 Weather App[3603:81353] [Common] _BSMachError: port 700f; (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
}

【问题讨论】:

    标签: ios swift asynchronous core-data nsurlsession


    【解决方案1】:

    URLSession.dataTask(with:completionHandler:) 的完成处理程序块在后台队列中调用,但您正在从该块访问视图上下文。视图上下文只能从主线程访问。

    相反,您应该使用后台任务:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多