2013-02-19 32 views
8

मुझे बस रेस्टकिट पता चला और यह ऐप का एक महत्वपूर्ण हिस्सा होगा जो मैं कर रहा हूं। उस समय, मैं इसे मूल डेटा के साथ एकीकृत करने में सक्षम था, लेकिन कई जीईटी अनुरोध भेजने का सबसे अच्छा तरीका नहीं मिला है।रेस्टकिट: एकाधिक अनुरोधों को कैसे बैच करें और एक बार खत्म होने के बाद प्रतिक्रिया प्राप्त करें?

मैं क्या करने की आवश्यकता है:

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", 
    @"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 के सभी init करना होगा और फिर उन्हें enqueue को ObjectManager::enqueueBatchOfObjectRequestOperations:progress:completion: विधि का उपयोग करें।

वैकल्पिक रूप से, और मुझे लगता है कि यह वास्तव में आसान और क्लीनर समाधान है, this question के स्वीकृत उत्तर में वर्णित प्रेषण समूहों का उपयोग करें।

+0

ठीक काम किया! धन्यवाद। – hdoria

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 

?