2013-02-19 12 views
8

Ich habe gerade herausgefunden RestKit und es wird ein wichtiger Teil der App, die ich mache. Zu der Zeit war ich in der Lage, es mit den Kerndaten zu integrieren, aber ich habe nicht die beste Möglichkeit gefunden, mehrere GET-Anfragen zu senden.RestKit: Wie mehrere Anfragen zu Batch und eine Antwort erhalten, sobald sie fertig sind?

Was ich tun muß, ist:

Daten aus den folgenden Adressen Erhalten:

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

Die URL wird in folgendem Format immer: http://url.com/api/SOMETHING/

Sobald alle Anfragen sind Fertig, ich möchte einen Code ausführen (z. B. einen neuen View-Controller aufrufen). Was wäre der beste Weg, dies zu tun?

Im Moment ist dies der Code Ich verwende:

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

Irgendwelche Tipps?

Antwort

10

Die RestKit Lösung wäre dies: Statt die bequeme Methode der Verwendung von Object :: getObjectsAtPath Sie manuell alle Ihre RKObjectRequestOperations müssen init und verwenden Sie dann ObjectManager::enqueueBatchOfObjectRequestOperations:progress:completion: Methode sie einzureihen.

Alternativ, und ich denke, das ist eigentlich einfacher und sauberer Lösung, verwenden Sie Versandgruppen wie in der angenommenen Antwort auf this question beschrieben.

+0

Arbeitete gut! Vielen Dank. – 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 

? 
Verwandte Themen