2016-03-21 21 views
2

Ich benutze RestKit in einer Anwendung und ich konfigurierte die Mapper und funktioniert gut. Ich habe CoreData zum Caching verwendet, und die üblichen fecthController für die Anzeige der Kerndatenmodelle in einer Tabellenansicht. Die erste Bildschirm meiner App ist ein UITabViewController mit drei Tabs. In jedem Tab habe ich verschiedene Informationen von verschiedenen Entitäten, ich kann zwischen den Tabs wechseln und alles funktioniert gut. Das Problem ist, wenn ich in einem Tab suche, habe ich die Daten von anderen Tabs verloren. Ich habe tief in das Problem gegraben und ich habe folgendes gesehen: Wenn ich nach etwas suche, lösche ich meine anderen Entitäten !!. Ich habe versucht, verschiedene Kontexte und einige Dinge zu erstellen, die mit den Kerndaten zusammenhängen, aber nichts funktioniert.RestKit behalten CoreData-Objekte

// Configuration stuff 
    let objectManager: RKObjectManager = RKObjectManager(baseURL: baseURL); 
    let managedObjectModel: NSManagedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL!)!; 
    let managedObjectStore: RKManagedObjectStore = RKManagedObjectStore(managedObjectModel: managedObjectModel); 
    objectManager.managedObjectStore = managedObjectStore;  
    managedObjectStore.createPersistentStoreCoordinator(); 
    do { 
     try managedObjectStore.addSQLitePersistentStoreAtPath(storePath, fromSeedDatabaseAtPath: seedPath, withConfiguration: nil, options: nil); 
    } catch let err as NSError { 
     fatalError() 
    } 

    // Create the managed object contexts 
    managedObjectStore.createManagedObjectContexts(); 
    managedObjectStore.managedObjectCache = RKInMemoryManagedObjectCache(managedObjectContext:  managedObjectStore.persistentStoreManagedObjectContext) 

// Mapping 
    let entityMapping: RKEntityMapping = RKEntityMapping(
     forEntityForName: "Entity", 
     inManagedObjectStore: RKObjectManager.sharedManager().managedObjectStore 
    ); 
    entityMapping.identificationAttributes = ["id"]; 

    entityMapping.addAttributeMappingsFromArray([ 
     "id", "firstName", "lastName", "birthdate" 
    ]); 

    //Get Data from server 
    class Datalist{ 
     class fun fetchData(successClosure:[Entity]->Void,failure:String->Void){ 
      RKObjectManager.sharedManager().getObjectsAtPath(
        path, 
        parameters: nil, 
        success: { 
         (operation: RKObjectRequestOperation!, result: RKMappingResult!) -> Void in 
         dispatch_async(dispatch_get_main_queue(), { 
          () -> Void in 
          successClosure(result.array()); 
         }); 
        }, 
        failure: { 
         (operation: RKObjectRequestOperation!, error: NSError!) -> Void in 
         dispatch_async(dispatch_get_main_queue(), { 
          () -> Void in 
          failureClosure(); 
         }); 
        } 
       ); 
      } 
    } 
} 
//Show data 
class ListViewController:NSFetchedResultsControllerDelegate{ 

     private var fetchedResultsController: NSFetchedResultsController!; 

     override func viewDidLoad() { 
      super.viewDidLoad(); 
      fetchedResultsController = NSFetchedResultsController(
      fetchRequest: fetchRequest, managedObjectContext: RKManagedObjectStore.defaultStore().mainQueueManagedObjectContext, 
      sectionNameKeyPath: "formatted", 
      cacheName: nil) 

      fetchedResultsController?.delegate = self 
      getData() 
     } 

     private func getData(){ 
      DataList.fetchData({data in 
       let ids = getEntitiesId(data) 
       fetchedResultsController.fetchRequest.predicate = createPredicateFromIds(ids) 
       try! self.fetchedResultsController?.performFetch() 
      },failure:{message in 
       showMessage(message) 
      }) 
     } 

     func createPredicateFromIds(entityIds: [Int]) -> NSPredicate { 
     let predicate: NSPredicate = NSPredicate(format: "id IN $ENTITYIDS").predicateWithSubstitutionVariables(["ENTITYIDS" : entityIds]); 
     return predicate; 
    } 
} 
+0

Sie müssen Code anzeigen und geben Details, wie Sie getestet und was Sie tatsächlich sehen verschwinden – Wain

+0

Ich habe ein Beispiel zur Verfügung gestellt! Vielen Dank @Wain – ocelot

+0

Also was ist Datenliste und was sind die IDs, die Sie mit dem Prädikat verwenden? Schließt das Prädikat alles einfach aus? – Wain

Antwort

1

Endlich habe ich das Problem gesehen, es ist in Bezug auf das Löschen von verwaisten Objekten. Weil in den drei Registerkarten unterschiedliche Entitäten sind und wenn ich eine Suche in der Entität durchführe, werden die anderen Entitäten verwaist und die Daten werden gelöscht! Überschreibe diese Eigenschaft nur:

override var deletesOrphanedObjects: Bool { 
     get{ 
      return false; 
     } 
     set{ 

     } 
    };