RestKit 0.20无法获取实体

时间:2013-08-22 21:42:46

标签: ios core-data restkit restkit-0.20

我使用restkit 0.2对服务器执行发布请求。以下是设置代码:

- (void)setupRestKit { //create RestKit object managers, one for API and one fore OAuth due to being seperate endpoings. API Object manager is default. RKObjectManager *apiObjectManager = [self instantiateAPIObjectManager]; _oauthObjectManager = [self instantiateOAuthObjectManager];

//create object store for core data persistence
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];

//provide store to object manager
_oauthObjectManager.managedObjectStore = managedObjectStore;
apiObjectManager.managedObjectStore = managedObjectStore;

//add default formatter for timestamp strings
NSTimeZone *UTC = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
[RKObjectMapping addDefaultDateFormatterForString:@"yyyy-MM-dd HH:mm:ss" inTimeZone:UTC];

// Register mappings
[KaptureOAuthToken registerEntityMappingWithObjectManager:self.oauthObjectManager];

[managedObjectStore createPersistentStoreCoordinator];

//create sqlite persistant store to cache data to disk
NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"kapture.sqlite"];
NSError *error;
NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:path
                                                                 fromSeedDatabaseAtPath:nil
                                                                      withConfiguration:nil
                                                                                options:@{
                                                                                          NSInferMappingModelAutomaticallyOption: @YES,
                                                                                          NSMigratePersistentStoresAutomaticallyOption: @YES
                                                                                        }
                                                                                  error:&error];
NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);

//create in-memory cache so objects are not persisted more than once
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

//create contexts for core data objects
[managedObjectStore createManagedObjectContexts];

}

  • (RKObjectManager *)instantiateAPIObjectManager { RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:[Environment sharedInstance].apiBaseURL]];

    //show network activity indicator when loading network resources [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;

    //set api key as default http header for requests [objectManager.HTTPClient setDefaultHeader:[Environment sharedInstance].apiKey value:@"Api-Key"];

    //set http header for device type (i.e. iPhone 4) and version of the app NSString *deviceName = [NSString stringWithFormat:@"%@ %@", [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion]]; NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; [objectManager.HTTPClient setDefaultHeader:@"X-Requested-With" value:[NSString stringWithFormat:@"%@ - %@", deviceName, majorVersion]];

    //set http header for api mime type [objectManager setAcceptHeaderWithMIMEType:[Environment sharedInstance].apiAcceptenceHeader];

    objectManager.HTTPClient.allowsInvalidSSLCertificate = YES;

    return objectManager; }

  • (RKObjectManager *)instantiateOAuthObjectManager { RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:[Environment sharedInstance].apiOAuthBaseURL]];

    //show network activity indicator when loading network resources [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;

    objectManager.HTTPClient.allowsInvalidSSLCertificate = YES;

    return objectManager; }

//create object store for core data persistence RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]]; //provide store to object manager _oauthObjectManager.managedObjectStore = managedObjectStore; apiObjectManager.managedObjectStore = managedObjectStore; //add default formatter for timestamp strings NSTimeZone *UTC = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; [RKObjectMapping addDefaultDateFormatterForString:@"yyyy-MM-dd HH:mm:ss" inTimeZone:UTC]; // Register mappings [KaptureOAuthToken registerEntityMappingWithObjectManager:self.oauthObjectManager]; [managedObjectStore createPersistentStoreCoordinator]; //create sqlite persistant store to cache data to disk NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"kapture.sqlite"]; NSError *error; NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:path fromSeedDatabaseAtPath:nil withConfiguration:nil options:@{ NSInferMappingModelAutomaticallyOption: @YES, NSMigratePersistentStoresAutomaticallyOption: @YES } error:&error]; NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error); //create in-memory cache so objects are not persisted more than once managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext]; //create contexts for core data objects [managedObjectStore createManagedObjectContexts];

并且通过这两种方法

通过NSManagedObject子类上的类别配置EntityMappings

-(void)setupNetworkCaching { NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil]; [NSURLCache setSharedURLCache:URLCache]; }

+ (void)registerEntityMappingWithObjectManager:(RKObjectManager *)objectManager { RKResponseDescriptor *responseDescriptor;
    responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[self entityMappingUsingStore:objectManager.managedObjectStore]
                                                                      method:RKRequestMethodPOST
                                                                 pathPattern:@"/"
                                                                     keyPath:@""
                                                                 statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    [objectManager addResponseDescriptor:responseDescriptor];
    

    }

  • responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[self entityMappingUsingStore:objectManager.managedObjectStore] method:RKRequestMethodPOST pathPattern:@"/" keyPath:@"" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; [objectManager addResponseDescriptor:responseDescriptor];

我的问题是:当我尝试执行POST请求时

(RKEntityMapping *)entityMappingUsingStore:(RKManagedObjectStore *)store { RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([KaptureOAuthToken class]) inManagedObjectStore:store];

NSDictionary *attributesDict = @{@"access_token": @"accessToken", @"token_type": @"tokenType", @"expires": @"expirationDate", @"expires_in": @"expiresIn", @"refresh_token": @"refreshToken"};

mapping.identificationAttributes = @[@"accessToken"];

[mapping addAttributeMappingsFromDictionary:attributesDict];

return mapping; }

我得到了服务器的预期响应,一切似乎都很顺利,但我在命令行中收到此错误。

[oauthObjectManager postObject:nil path:@"/" parameters:params success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { dispatch_async(dispatch_get_main_queue(), ^(){ completion(YES, nil, mappingResult); }); } failure:^(RKObjectRequestOperation *operation, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^(){ [self notifyLoginError:error forNetwork:network]; }); }];

2013-08-22 17:29:11.949 Kapture[25335:1007] W restkit.core_data.cache:RKEntityByAttributeCache.m:173 Failed to load entity cache. Failed to execute fetch request: (entity: KaptureOAuthToken; predicate: ((null)); sortDescriptors: ((null)); type: NSDictionaryResultType; includesPendingChanges: NO; propertiesToFetch: (( "(), name accessToken, isOptional 1, isTransient 0, entity KaptureOAuthToken, renamingIdentifier accessToken, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 700 , attributeValueClassName NSString, defaultValue (null)", "(), name objectID, isOptional 1, isTransient 0, entity (null), renamingIdentifier objectID, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}" )); ) 它似乎无法在缓存中找到实体,但我真的不确定。任何信息都会一如既往地受到赞赏!

0 个答案:

没有答案