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)
die Mapping-Code anzeigen und ein wenig von der log, wo es die abgebildeten Objekte am Ende zeigt – Wain