2016-03-30 3 views
0

Ich habe das folgende Problem: Ich benutze RestKit, um Objekte von einem REST API zu erhalten. Das Objekt-Mapping funktioniert, was ich aus der RK-Debugger-Ausgabe sehen kann. Wenn ich danach eine Fetch-Anfrage durchführe, ist das Ergebnis leer. Ich spreche von NSManagedObjects. Ich habe folgendes Setup.FetchRequest gibt NSManagedObjects nicht zurück, die über RestKit 0.2 geladen wurden

[[RKObjectManager sharedManager] 
    postObject:nil path:@"/gocoffee/api/V1/login/IOS" 
    parameters:nil 
    success: ^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     NSLog(@"Objects have been saved in core data."); 
     NSManagedObjectContext *managedObjCtx = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext; 

     // Shout* sh=[managedObjCtx insertNewObjectForEntityForName:@"Shout"]; 
     // [email protected]"22223"; 

     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Shout" inManagedObjectContext:managedObjCtx]; 
     [fetchRequest setEntity:entity]; 

     NSError *error = nil; 
     NSArray *result = [managedObjCtx executeFetchRequest:fetchRequest error:&error]; 

     if (error) { 
      NSLog(@"Unable to execute fetch request."); 
      NSLog(@"%@, %@", error, error.localizedDescription); 

     } else { 
      NSLog(@"%@", result); 
     } 




     completionBlock(); 
    } 
    failure: ^(RKObjectRequestOperation *operation, NSError *error) { 
     RKLogError(@"Load failed with error: %@", error); 
    }]; 

Das holen Ergebnis leer ist, obwohl der Server:

1: Restkit und Coredata-Stack-Initialisierung:

NSError *error; 
NSURL *baseURL = [NSURL URLWithString:@"https://mfihost.us/gocoffee/api/V1/"]; 
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL]; 
[objectManager.HTTPClient setDefaultHeader:@"Token" value:[NSString stringWithFormat:@"%@",[FBSDKAccessToken currentAccessToken].tokenString]]; 

objectManager.requestSerializationMIMEType = RKMIMETypeJSON; 
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; 
objectManager.managedObjectStore = managedObjectStore; 
//[RKObjectManager setSharedManager:objectManager]; 
[FetchRequests registerFetchRequests:objectManager]; 
[Descriptors registerDescriptors:objectManager]; 
[managedObjectStore createPersistentStoreCoordinator]; 
NSPersistentStore *persistentStore = [managedObjectStore addInMemoryPersistentStore:&error]; 
NSAssert(persistentStore, @"Failed to add inmemory store with error: %@", error); 
[managedObjectStore createManagedObjectContexts]; 
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext]; 

2: danach rufen Objekte von Server zu erhalten und eine Abrufanforderung durchführen gibt Objekte zurück, und diese Objekte werden ordnungsgemäß zugeordnet, indem RKEntityMappings und die entsprechenden Antwortdeskriptoren verwendet werden. Verwirrenderweise, wenn ich die zwei Zeilen // Shout * .... auskommentiere (d. H. Manuell ein verwaltetes Objekt in den Kontext einfügen), dann wird dieses Objekt von der Abrufanforderung geholt. Folglich sollte die Abrufanforderung gut funktionieren. Ich suche jetzt seit Ewigkeiten, was das Problem sein könnte. Könnte es sein, dass ich den falschen Kontext oder etwas anrufe? Übrigens: Das Debuggen von Kerndaten-Multi-Threading ist aktiviert und zeigt keinen Fehler, d. H. Keinen "AllThatIsLeftToUsIsHonor" -Fehler.

Die entsprechende Strecke aus dem obigen Beispiel ist:

[objectManager.router.routeSet 
    addRoute:[RKRoute routeWithName:@"loginAndOrSignup" 
         pathPattern:@"login/IOS" 
           method:RKRequestMethodPOST] 
    ]; 

Die Deskriptoren wie (Beispiel) aussehen:

[objectManager addResponseDescriptor: 
    [RKResponseDescriptor responseDescriptorWithMapping:[shoutMapping inverseMapping] 
                method:RKRequestMethodPOST 
              pathPattern: @"login/IOS" 
               keyPath:@"response.incomingshoutapplications" 
              statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful) 
     ] 
    ]; 

Shout Abbildung ist wie folgt:

RKEntityMapping *shoutMapping = [RKEntityMapping mappingForEntityForName:@"Shout" inManagedObjectStore:managedObjectStore]; 
    shoutMapping.identificationAttributes = @[ @"id" ]; 
    [shoutMapping addAttributeMappingsFromDictionary:@{ 
                 @"id" : @"id", 
                 @"inviterUserId" : @"inviterUserId", 
                 @"eventType" : @"eventType", 
                 @"eventTime" : @"eventTime", 
                 @"locationLat" : @"locationLat", 
                 @"locationLng" : @"locationLng", 
                 @"radius" : @"radius", 
                 @"targetGender" : @"targetGender", 
                 @"state" : @"state", 
                 @"buddyOnly" : @"buddyOnly", 
                 @"timeCreated" : @"timeCreated" 
                 } 
    ]; 

Die " Manager "ist der von oben, der managedObjectStore ist manager.managedObjectStore Alle Zuordnungen und Deskriptoren werden in einer anderen Methode eingerichtet, die von [Descriptors registerDescriptors: objectManager] aufgerufen wird; (siehe ersten Block)

+0

die Mapping-Code anzeigen und ein wenig von der log, wo es die abgebildeten Objekte am Ende zeigt – Wain

Antwort

0

Das Problem ist wahrscheinlich, dass Sie inverseMapping verwenden. Dies wird hauptsächlich für das Anforderungsmapping verwendet, da es sich um ein Mapping handelt, das Instanzen von NSMutableDictionary erstellt, was nicht Ihren Vorstellungen entspricht.

Also, was ich erwarte ist passiert ist, dass die Antwort erfolgreich zugeordnet ist, aber auf einfache Objekte, nicht verwaltete Objekte, und dann werfen Sie das Ergebnis weg. ändern

Gerade

... responseDescriptorWithMapping:shoutMapping ... 
+0

sorry für die späte Antwort .... Ich werde dies bald ausprobieren und sag dir, ob es funktioniert hat :-) aber danke schon ... – michimaxi

Verwandte Themen