Nic*_*ico 9 core-data nsfetchedresultscontroller ios swift
我有一个NSFetchedResultsController管理我的UITableView数据源.
我试图使用a 修改NSManagedObject被调用的属性.所以我创建了批量更新:amountToComputeNSBatchUpdateRequest
let batchUpdate = NSBatchUpdateRequest(entityName: "MyEntity")
batchUpdate.propertiesToUpdate = ["amountToCompute" : newAmount]
batchUpdate.resultType = .UpdatedObjectIDsResultType
Run Code Online (Sandbox Code Playgroud)
我执行它:
var batchError: NSError?
let batchResult = managedContext.executeRequest(batchUpdate, error: &batchError) as! NSBatchUpdateResult?
Run Code Online (Sandbox Code Playgroud)
为了更新我当前的托管上下文,我更新了managedContext中的每个managedObject并执行了一个新的获取fetchedResultsController:
if let result = batchResult {
let objectIDs = result.result as! [NSManagedObjectID]
for objectID in objectIDs {
let managedObject: NSManagedObject = managedContext.objectWithID(objectID)
if !managedObject.fault {
managedContext.refreshObject(managedObject, mergeChanges: true)
}
if !fetchedResultsController.performFetch(&error) {
println("error: + \(error?.localizedDescription), \(error!.userInfo)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我实现了委托的一些方法NSFetchedResultsControllerDelegate来管理由以下发送的结果中的更改NSFetchedResultsController:
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
...
case .Update:
reloadRowsAtIndexPaths([indexPath!], animation: reloadRowsWithAnimation)
let myManagedObject = anObject as! MyManagedObject
println("update : \(myManagedObject.amountToCompute)")
...
}
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}
Run Code Online (Sandbox Code Playgroud)
我在我的8.4 iOS模拟器上运行应用程序,一切都很顺利.
println("update : \(myManagedObject.amountToCompute)")打印新值.
我在iPhone 6 8.4.1上运行应用程序并且值未更新,println("update : \(myManagedObject.amountToCompute)")打印旧值.新值已正确保存,但更改不会出现在我的表视图中,而是在模拟器上进行.
怎么了?为什么我在模拟器上或在我的设备上可能会有所不同.版本并不完全相同,但我怀疑Apple在上次更新中触及了Core Data架构.
小智 5
这是一个不寻常的,但已知的问题,我遇到了自己,并花了几天拔出我的头发,直到找到这篇博文,这对我有用.
它归结为添加这一行代码将staleness间隔设置为零:
[context setStalenessInterval:0];
如果我正在阅读你的帖子,你就会遇到同样的问题.:)
| 归档时间: |
|
| 查看次数: |
1567 次 |
| 最近记录: |