2015-08-25 17 views
8

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ọ.

+0

Trên thiết bị, bạn có nhận được loại thay đổi Di chuyển ('NSFetchedResultsChangeMove') không? – quellish

+0

Không, không phải trên trình mô phỏng. – Nico

Trả lời

3

Đây là một vấn đề bất thường, nhưng được biết đến mà tôi gặp phải và dành một vài ngày để kéo tóc ra cho đến khi tìm thấy bài đăng trên blog này.

https://stevenpsmith.wordpress.com/2011/08/12/nsfetchedresultscontroller-and-core-data-managed-object-updates/

Nó luộc xuống để thêm dòng này duy nhất của mã mà thiết lập khoảng thời gian để staleness zero:

[bối cảnh setStalenessInterval: 0];

Nếu tôi đang đọc bài đăng của bạn, bạn đang gặp phải vấn đề tương tự. :)

+0

Holy ****! Biệt hiệu của bạn phục vụ bạn tốt, bạn là một ông chủ !!! Tôi đã đi rất nhiều năm để tìm ra giải pháp! Cảm ơn rất nhiều! – Nico

+0

Bất kỳ ý tưởng nào mặc dù tại sao nó lại hoạt động trên trình mô phỏng? – Nico

+1

Có thực sự, không có độ trễ phần cứng thực tế trong môi trường VM, hiệu ứng StalenessInterval của 0, khi trình mô phỏng liên tục bỏ phiếu, ít nhất cũng nhanh như tốc độ bus. –

Các vấn đề liên quan