2013-02-19 28 views
8

Tôi vừa phát hiện ra RestKit và nó sẽ là một phần quan trọng của ứng dụng tôi đang làm. Vào thời điểm đó, tôi đã có thể tích hợp nó với dữ liệu cốt lõi, nhưng đã không tìm ra cách tốt nhất để gửi nhiều yêu cầu GET.RestKit: Làm thế nào để thực hiện nhiều yêu cầu và nhận được phản hồi sau khi hoàn thành?

Những gì tôi cần làm là:

Lấy dữ liệu từ các địa chỉ sau:

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

URL sẽ luôn theo định dạng sau: http://url.com/api/SOMETHING/

Khi mọi yêu cầu là kết thúc, tôi muốn chạy một mã (chẳng hạn như gọi một bộ điều khiển xem mới). cách nào tốt nhất để làm việc này?

Tại thời điểm này, đây là đoạn code Tôi đang sử dụng:

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

Bất cứ lời khuyên?

Trả lời

10

Giải pháp RestKit sẽ là: thay vì sử dụng các phương pháp thuận tiện ObjectManager :: getObjectsAtPath bạn sẽ phải init tất cả các bạn RKObjectRequestOperations bằng tay và sau đó sử dụng phương pháp để ObjectManager::enqueueBatchOfObjectRequestOperations:progress:completion: enqueue họ.

Ngoài ra, và tôi nghĩ đây thực sự là giải pháp dễ dàng và sạch hơn, hãy sử dụng các nhóm công văn như được mô tả trong câu trả lời được chấp nhận cho this question.

+0

Đã hoạt động tốt! Cảm ơn. – 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 

? 
Các vấn đề liên quan