2015-08-25 16 views
8

Ho un NSFetchedResultsController che gestisce la mia origine dati UITableView.Dati principali NSFetchedResultsController non aggiornato dopo un batchUpadate sul dispositivo ma ok sul simulatore

Sto tentando di modificare una proprietà di NSManagedObject denominata amountToCompute utilizzando un NSBatchUpdateRequest. Così ho creato l'aggiornamento batch:

let batchUpdate = NSBatchUpdateRequest(entityName: "MyEntity") 
batchUpdate.propertiesToUpdate = ["amountToCompute" : newAmount] 
batchUpdate.resultType = .UpdatedObjectIDsResultType 

I eseguirlo:

var batchError: NSError? 
let batchResult = managedContext.executeRequest(batchUpdate, error: &batchError) as! NSBatchUpdateResult? 

e per aggiornare il mio contesto gestito corrente, aggiorno ogni managedObject nel managedContext ed eseguire una nuova fetch fetchedResultsController:

Ho implementato alcuni metodi del delegato NSFetchedResultsControllerDelegate per gestire le modifiche nei risultati inviati dallo 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() 
    } 

Corro l'app sul mio simulatore 8.4 su iOS e tutto va bene. println("update : \(myManagedObject.amountToCompute)") stampa il nuovo valore.

Corro l'app sul mio iPhone 6 8.4.1 e il valore non è aggiornato, println("update : \(myManagedObject.amountToCompute)") stampa il vecchio valore. Il nuovo valore viene salvato correttamente, ma le modifiche non vengono visualizzate nella visualizzazione tabella mentre vengono eseguite sul simulatore.

Cosa c'è che non va? Come mai può essere diverso se sono sul simulatore o sul mio dispositivo. Le versioni non sono esattamente le stesse, ma dubito che Apple abbia toccato l'architettura Core Data nel loro ultimo aggiornamento.

+0

Sul dispositivo, si ottiene un tipo di modifica di spostamento ('NSFetchedResultsChangeMove')? – quellish

+0

No, nemmeno sul simulatore. – Nico

risposta

3

Questo è un problema insolito, ma noto, che mi sono imbattuto in me stesso e ho trascorso un paio di giorni a tirarmi fuori i capelli fino a quando ho trovato questo post sul blog, che ha funzionato per me.

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

Si riassunta in aggiunta questa riga di codice che impostare l'intervallo stantio a zero:

[contesto setStalenessInterval: 0];

Se sto leggendo il tuo post, stai riscontrando lo stesso problema. :)

+0

Holy ****! Il tuo soprannome ti sta bene, sei un capo !!! Ero così lontano anni per trovare la soluzione! Molte grazie! – Nico

+0

Qualche idea sul perché stava lavorando al simulatore? – Nico

+1

Sì, in realtà non esiste una latenza hardware effettiva in un ambiente VM, l'effetto StalenessInterval pari a 0, poiché il simulatore esegue il polling continuo, anche se almeno altrettanto veloce della velocità del bus. –