2013-02-19 10 views
8

Ho appena scoperto RestKit e sarà una parte importante dell'app che sto facendo. A quel tempo, ero in grado di integrarlo con i dati di base, ma non ho trovato il modo migliore per inviare più richieste GET.RestKit: come eseguire il batch di più richieste e ottenere una risposta al termine?

Che cosa devo fare è:

Prendi i dati dei seguenti indirizzi:

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

L'URL sarà sempre nel seguente formato: http://url.com/api/SOMETHING/

Una volta tutte le richieste sono finito, mi piacerebbe eseguire un codice (come ad esempio chiamare un nuovo controller di visualizzazione). Quale sarebbe il modo migliore per farlo?

Al momento, questo è il codice che sto utilizzando:

- (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); 
    }]; 
} 

Qualche consiglio?

risposta

10

La soluzione RestKit sarebbe questo: invece di utilizzare il metodo comodo ObjectManager :: getObjectsAtPath si dovrà init tutti i tuoi RKObjectRequestOperations manualmente e quindi utilizzare ObjectManager::enqueueBatchOfObjectRequestOperations:progress:completion: metodo per accodare loro.

In alternativa, e penso che questa sia in realtà una soluzione più semplice e più pulita, utilizzare i gruppi di spedizione come descritto nella risposta accettata allo this question.

+0

Ha funzionato bene! Grazie. – 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 

? 
Problemi correlati