Сохранение JSON в базовые данные

Я посмотрел на следующие вопросы, и они не обратились к моей проблеме:

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

2016-01-07 09: 49: 33.096 AppleLawnApp [564: 400038] CoreData: ошибка: серьезная ошибка приложения. Исключение было обнаружено при обработке изменений базовых данных. Обычно это ошибка в наблюдателе NSManagedObjectContextObjectsDidChangeNotification. — [__NSCFSet addObject:]: попытка вставить nil с userInfo (null)

2016-01-07 09: 49: 33.098 AppleLawnApp [564: 400038] *** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: ‘- [__ NSCFSet addObject:]: попытка вставить 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! StringnewEntry.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

Решение

Мое первое предположение, основанное на сообщении об ошибке, заключается в том, что вы можете получить неожиданное нулевое значение обратно в 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

Другие решения

Других решений пока нет …