2016-01-07 3 views
0

Я посмотрел на следующие вопросы, и они не касались вопроса у меня есть:Сохранение JSON в Core Data

Другие предложенные ссылки не были даже близки к мой вопрос. Моя проблема заключается в следующем: я собираю данные из своего собственного домена, используя JSON Decode, а затем пытаюсь вставить данные в Core Data. Является ли работает 99% времени, но мое приложение падает иногда и я получаю сообщение об ошибке:

2016-01-07 09:49:33.096 AppleLawnApp[564:400038] CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)

2016-01-07 09:49:33.098 AppleLawnApp[564:400038] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil'

Я поместил его внутрь блока действия кода для кнопки:

let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext 

    let url = NSURL(string: "http://www.mydomain/file.php") 

    if url != nil { 

     let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in 

      if error == nil { 

       let urlContent = NSString(data: data!, encoding: NSUTF8StringEncoding) as NSString! 

       let data: NSData = urlContent.dataUsingEncoding(NSUTF8StringEncoding)! 

       do { 

        let jsonObject = try (NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSArray)! 

        var index1 = 0 

        while index1 < jsonObject.count { 

         let newEntry = NSEntityDescription.insertNewObjectForEntityForName(MyTableData, inManagedObjectContext: context) as NSManagedObject 

         let maindata = (jsonObject[index1] as! NSDictionary) 

         let this1 = maindata["dBase1"] as! String 

         let this2 = maindata["dBase2"] as! String 

         let this3 = maindata["dBase3"] as! String 

         let this4 = maindata["dBase4"] as! String 

         let this5  = maindata["dBase5"] as! String 

         let this6  = maindata["dBase6"] as! String 



         newEntry.setValue(this1, forKey: "CD1") 

         newEntry.setValue(this2, forKey: "CD2") 

         newEntry.setValue(this3, forKey: "CD3") 

         newEntry.setValue(this4, forKey: "CD4") 

         newEntry.setValue(this5, forKey: "CD5") 

         newEntry.setValue(this6, forKey: "CD6") 

         do { 

          try context.save() 

         } 

         catch { 

          print(error) 

         } 

         let data1 = arrayOne(c1: this1 c2: this2, c3: this3, c4: this4, c5: this5, c6: this6) 

         self.myArray.append(data1) 

         index1++ 

        } 

       } 

       catch { 

        print(error) 

       } 

      } 

     }) 

     task.resume() 

    }   

} 

ответ

0

Мои первое предположение, основанное на сообщении об ошибке, заключается в том, что вы можете получить неожиданное значение null в json, где ваш объект модели имеет значение, помеченное как необязательное. Возможно, попробуйте проверить данные перед обновлением NSManagedObject. Вот несколько подобных способов:

if let this1 = maindata["dBase1"] { 

    newEntry.setValue(this1, forKey: "CD1") 

} else { 

    assertionFailure("missing dBase1") 
} 

ИЛИ, что-то вроде этого:

guard let this2 = maindata["dBase2"] 
    , let this3 = maindata["dBase3"] 
    , let this4 = maindata["dBase4"] else { 

    assertionFailure("missing data") 
    return 
} 

newEntry.setValue(this2, forKey: "CD2") 
newEntry.setValue(this3, forKey: "CD3") 
newEntry.setValue(this4, forKey: "CD4") 
+0

Я проверить это. Спасибо за вход. –

Смежные вопросы