我刚刚发现了RestKit,它将成为我正在做的应用程序的重要部分.当时,我能够将它与核心数据集成,但还没有找到发送多个GET请求的最佳方式.
我需要做的是:
从以下地址获取数据:
http://url.com/api/banner/ http://url.com/api/category/ http://url.com/api/link/
URL将始终采用以下格式:http://url.com/api/SOMETHING/
完成所有请求后,我想运行一个代码(例如调用一个新的视图控制器).最好的方法是什么?
目前,这是我正在使用的代码:
- (id)init { self = [super init]; if (self) { [self setupConnector]; [self setupDatabase]; [self setupMappings]; [self sendRequests]; } return self; } - (void)setupConnector { // Initialize RestKIT RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://baseURL"]]; self.managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:[[NLCoreData shared] managedObjectModel]]; objectManager.managedObjectStore = self.managedObjectStore; } - (void)setupDatabase { NSString *storePath = [[NLCoreData shared] storePath]; NSError *error = nil; NSPersistentStore *persistentStore = [self.managedObjectStore addsqlitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error]; NSAssert(persistentStore,@"Failed to add persistent store with error: %@",error); [self.managedObjectStore createManagedObjectContexts]; self.managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:self.managedObjectStore.persistentStoreManagedObjectContext]; } - (void)setupMappings { RKObjectManager *objectManager = [RKObjectManager sharedManager]; // Mappings // banner RKEntityMapping *bannerMapping = [RKEntityMapping mappingForEntityForName:@"Banner" inManagedObjectStore:self.managedObjectStore]; [bannerMapping addAttributeMappingsFromDictionary:@{ @"title": @"title",@"id": @"bannerID",@"created_at": @"created_at",@"image": @"image",@"resource_uri": @"resource_uri",@"updated_at": @"updated_at",@"url": @"url" }]; bannerMapping.identificationAttributes = @[ @"bannerID" ]; RKResponseDescriptor *bannerDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:bannerMapping pathPattern:@"/api/v1/banner/" keyPath:@"objects" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; [objectManager addResponseDescriptor:bannerDescriptor]; // category RKEntityMapping *categoryMapping = [RKEntityMapping mappingForEntityForName:@"Category" inManagedObjectStore:self.managedObjectStore]; [categoryMapping addAttributeMappingsFromDictionary:@{ @"name": @"name",@"id": @"categoryID",@"active": @"active" }]; categoryMapping.identificationAttributes = @[ @"categoryID" ]; RKResponseDescriptor *categoryDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:categoryMapping pathPattern:@"/api/v1/category/" keyPath:@"objects" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; [objectManager addResponseDescriptor:categoryDescriptor]; } - (void)sendRequests { RKObjectManager *objectManager = [RKObjectManager sharedManager]; // Send Request [objectManager getObjectsAtPath:@"/api/v1/banner/" parameters:nil success:^(RKObjectRequestOperation * operation,RKMappingResult *mappingResult) { NSLog(@"SUCCESS: %@",mappingResult.array); } failure: ^(RKObjectRequestOperation * operation,NSError * error) { NSLog(@"FAILURE %@",error); }]; // category [objectManager getObjectsAtPath:@"/api/v1/category/" parameters:nil success:^(RKObjectRequestOperation * operation,error); }]; }
有小费吗?
解决方法
RestKit解决方案是这样的:不是使用方便方法ObjectManager :: getObjectsAtPath,而是必须手动初始化所有RKObjectRequestOperations,然后使用
ObjectManager::enqueueBatchOfObjectRequestOperations:progress:completion:方法将它们排入队列.
或者,我认为这实际上更容易和更清洁的解决方案,使用this question接受的答案中描述的调度组.