2013-02-19 47 views
8

我刚刚发现了RestKit,它将成为我正在做的应用程序的重要组成部分。当时,我能够将其与核心数据集成,但还没有找到发送多个GET请求的最佳方式。RestKit:如何批量处理多个请求并在完成后得到响应?

我需要做的是:

从下面的地址数据:

http://url.com/api/banner/ 
http://url.com/api/category/ 
http://url.com/api/link/ 

的网址将始终是以下格式: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", 
    @"created_at": @"created_at", 
    @"resource_uri": @"resource_uri", 
    @"updated_at": @"updated_at", 
    @"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, RKMappingResult *mappingResult) { 
     NSLog(@"SUCCESS: %@", mappingResult.array); 
    } failure: ^(RKObjectRequestOperation * operation, NSError * error) { 
     NSLog(@"FAILURE %@", error); 
    }]; 
} 

任何提示吗?

回答

10

的RestKit的解决办法是这样的:而不是使用简便方法的ObjectManager :: getObjectsAtPath你必须手动初始化所​​有RKObjectRequestOperations,然后用ObjectManager::enqueueBatchOfObjectRequestOperations:progress:completion:方法来排队它们。

另外,我认为这实际上是更容易和更干净的解决方案,使用派遣组如this question的接受答案中所述。

+0

工作很好!谢谢。 – hdoria 2013-02-28 01:28:29

2
NSURL *url1 = [NSURL URLWithString:@"http://baseURL.domain/api/banner/"]; 
    NSMutableURLRequest *request2 = [NSMutableURLRequest requestWithURL:url1]; 
    RKObjectRequestOperation *objectRequestOperation1 = [[RKObjectRequestOperation alloc] initWithRequest:request2 responseDescriptors:@[ ResponseDescriptor ]]; 


NSURL *url2 = [NSURL URLWithString:@"http://baseURL.domain/api/category/"]; 
    NSMutableURLRequest *request2 = [NSMutableURLRequest requestWithURL:url2]; 
    RKObjectRequestOperation *objectRequestOperation2 = [[RKObjectRequestOperation alloc] initWithRequest:request2 responseDescriptors:@[ ResponseDescriptor ]]; 


    NSArray *requestArray = [NSArray arrayWithObjects:objectRequestOperation,objectRequestOperation1,objectRequestOperation2, nil]; 


    [[RKObjectManager sharedManager] enqueueBatchOfObjectRequestOperations:requestArray progress:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { 
     // 
     // Handle process indicator 
     // 
     NSLog(@"%lu",(unsigned long)totalNumberOfOperations); 

    } completion:^(NSArray *operations) { 
     // 
     // Remove blocking dialog, do next tasks 

?