2017-03-16 69 views
0

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

2017-03-16 23:56:21.197036天气应用[3603:81353] [常见] _BSMachError:port 700f; (os/kern)无效能力(0x14)“无法插入COPY_SEND”

2017-03-16 23:56:21.197265天气应用[3603:81353] [Common] _BSMachError:port 700f; (OS /克恩)无效的名称(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 
} 

回答

0

完成处理块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() 
}