【发布时间】:2018-10-01 20:25:04
【问题描述】:
我的应用有一个核心数据实体(称为产品),它有两个属性:
- 字符串类型的名称
- 二进制数据类型的图像(选中“允许外部存储”)
现在,由于我正在开发,我在初始 viewDidLoad 中创建了一个默认对象,其中包含名称和图像的硬编码值。创建对象后,我可以传递它并在我的应用程序中使用它而不会出现问题。
但是,如果我将 name 属性更新为新的字符串值,然后重新运行应用程序,图像属性将变为 nil(此行为仅在我重新运行应用程序后才会发生,或终止并重新打开它)。你知道是什么导致了这种行为吗?
这就是我更改名称值的方式:
DataController.shared.viewContext.perform {
if mike {
product.name = "Mike"
} else {
product.name = "Bob"
}
try? DataController.shared.viewContext.save()
}
我正在使用 DataController 类与持久存储进行交互:
class DataController {
static let shared = DataController(modelName: "my_model")
let persistentContainer: NSPersistentContainer
var viewContext: NSManagedObjectContext {
return persistentContainer.viewContext
}
private init(modelName: String) {
persistentContainer = NSPersistentContainer(name: modelName)
}
func configureContexts() {
viewContext.automaticallyMergesChangesFromParent = true
viewContext.mergePolicy = NSMergePolicy.mergeByPropertyStoreTrump
}
}
我也在使用NSFetchedResultsController。这就是我在viewDidLoad 中设置它的方式:
fileprivate func setupFetchedResultsController() {
let fetchRequest:NSFetchRequest<Product> = Product.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: "salesByVolume", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: DataController.shared.viewContext, sectionNameKeyPath: nil, cacheName: "products")
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch {
fatalError("The request could not be performed: \(error.localizedDescription)")
}
}
谢谢!
【问题讨论】:
-
这个问题已经在这里更详细地存在了:stackoverflow.com/questions/52586564/…
标签: ios swift core-data nsfetchedresultscontroller