8

私は RestKit を見つけたばかりで、私がやっているアプリの重要な部分になるでしょう。その時点で、それをコア データと統合することはできましたが、複数の GET 要求を送信する最善の方法がわかりませんでした。

私がする必要があるのは:

次のアドレスからデータを取得します。

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

任意のヒント?

4

2 に答える 2

10

RestKitソリューションは次のようになります。コンビニエンスメソッドObjectManager::getObjectsAtPathを使用する代わりに、すべてのRKObjectRequestOperationsを手動で初期化し、 ObjectManager :: enqueueBatchOfObjectRequestOperations:progress:completion:メソッドを使用してそれらをエンキューする必要があります。

または、これは実際にはより簡単でクリーンなソリューションだと思います。この質問に対する受け入れられた回答で説明されているように、ディスパッチグループを使用してください。

于 2013-02-20T11:44:11.633 に答える
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

?
于 2013-07-11T11:54:52.167 に答える