Ios 从'保存到CoreData;cellForRowAtIndexPath';滚动时崩溃
我有一个包含图像的表视图保存功能有几个问题:Ios 从'保存到CoreData;cellForRowAtIndexPath';滚动时崩溃,ios,swift,uitableview,core-data,Ios,Swift,Uitableview,Core Data,我有一个包含图像的表视图保存功能有几个问题: 1.您正在为每个图像创建一个私有队列上下文,这并不是一个好主意。更好的方法是创建一个专用队列上下文,并使用它保存所有图像。 2.不要在cellforrowatinexpath中调用此save image函数,因为上下滚动tableview时会多次调用此委托函数。只需在其他地方执行此操作,例如在下载映像完成回拨中。 3.由于CoreData不是线程安全的,因此必须在私有上下文的线程而不是主线程上插入新映像。所以你必须这样做: privateMoc.pe
1.您正在为每个图像创建一个私有队列上下文,这并不是一个好主意。更好的方法是创建一个专用队列上下文,并使用它保存所有图像。
2.不要在
cellforrowatinexpath
中调用此save image函数,因为上下滚动tableview时会多次调用此委托函数。只需在其他地方执行此操作,例如在下载映像完成回拨中。3.由于CoreData不是线程安全的,因此必须在私有上下文的线程而不是主线程上插入新映像。所以你必须这样做:
privateMoc.performBlock({
let entity = NSEntityDescription.entityForName("Images", inManagedObjectContext: privateMoc)
let options = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: privateMoc)
options.setValue(url, forKey: "url")
options.setValue(imageData, forKey: "imageData")
do {
try privateMoc.save()
print("Successfuly Saved an Image to Core Data.")
do {
try managedContext.save()
} catch {
}
} catch {
// Failed to save
}
})
在您完成这三个修复之后,我相信问题应该会得到解决。也许您可以使用SDWebImage
privateMoc.performBlock({
let entity = NSEntityDescription.entityForName("Images", inManagedObjectContext: privateMoc)
let options = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: privateMoc)
options.setValue(url, forKey: "url")
options.setValue(imageData, forKey: "imageData")
do {
try privateMoc.save()
print("Successfuly Saved an Image to Core Data.")
do {
try managedContext.save()
} catch {
}
} catch {
// Failed to save
}
})