Tôi có một NSFetchedResultsController
đã quản lý nguồn dữ liệu UITableView
của mình.Dữ liệu lõi NSFetchedResultsController không được cập nhật sau một batchUpadate trên thiết bị nhưng ok trên mô phỏng
Tôi đang cố gắng sửa đổi thuộc tính của NSManagedObject
được gọi là amountToCompute
bằng cách sử dụng NSBatchUpdateRequest
. Vì vậy, tôi tạo ra các bản cập nhật hàng loạt:
let batchUpdate = NSBatchUpdateRequest(entityName: "MyEntity")
batchUpdate.propertiesToUpdate = ["amountToCompute" : newAmount]
batchUpdate.resultType = .UpdatedObjectIDsResultType
tôi thực hiện nó:
var batchError: NSError?
let batchResult = managedContext.executeRequest(batchUpdate, error: &batchError) as! NSBatchUpdateResult?
Và để cập nhật nội dung quản lý hiện tại của tôi, tôi cập nhật mỗi managedObject trong managedContext và thực hiện một mới lấy của 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)")
}
}
}
Tôi đã thực hiện một số phương pháp của đại biểu NSFetchedResultsControllerDelegate
để quản lý các thay đổi trong kết quả được gửi bởi 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()
}
Tôi chạy ứng dụng trên trình mô phỏng iOS 8.4 của tôi và mọi thứ đều ổn. println("update : \(myManagedObject.amountToCompute)")
in giá trị mới.
Tôi chạy ứng dụng trên iPhone 6 8.4.1 của tôi và giá trị không được cập nhật, println("update : \(myManagedObject.amountToCompute)")
in giá trị cũ. Giá trị mới được lưu đúng cách nhưng các thay đổi không xuất hiện trong chế độ xem bảng của tôi khi chúng thực hiện trên trình mô phỏng.
Có vấn đề gì? Làm thế nào đến nó có thể khác nhau cho dù tôi đang trên giả lập hoặc trên thiết bị của tôi. Các phiên bản không hoàn toàn giống nhau nhưng tôi nghi ngờ Apple đã chạm vào kiến trúc Core Data trong bản cập nhật cuối cùng của họ.
Trên thiết bị, bạn có nhận được loại thay đổi Di chuyển ('NSFetchedResultsChangeMove') không? – quellish
Không, không phải trên trình mô phỏng. – Nico