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