0

それで、ここに私の質問があります。

私がやりたいことは、リソースの読み込みをキューに入れることです。すべてのリソース要求の読み込みが一度に 1 つずつ行われるようにします (これらのリソースを受け取る順序を制御します)。

そのような動作を完了するための正しくてクリーンな方法は何でしょうか?

4

1 に答える 1

0

わかりました、私はそれを手に入れたと思います。

  • EveryRKObjectLoaderRKRequestオブジェクトのサブクラスです。したがって、カスタマイズされた に関連付けられている可能性がありますRKRequestQueue
  • 一度RKRequestQueueに 1 つの要素のみを処理できるように構成して、順序付けを行うことができます。同時実行数を 1 に設定する。

私は擬似コードを持っています:

  1. を作成し、RKRequestQueueその同時実行数を 1 に定義します。
  2. 保留中としてマークし、リソースの読み込みリクエストのキューイングが完了するまで読み込みを待機するようにします。
  3. リソース読み込みリクエストをループし、実行したい順序で追加します。

リクエストキューの遅延読み込みから始めます

- (RKRequestQueue *)mainDownloadRequestQueue {
    if (!_mainDownloadRequestQueue) {
        // Creating the request queue
        RKRequestQueue * queue = [RKRequestQueue requestQueue];
        //queue.delegate = self;
        queue.concurrentRequestsLimit = 1;
        queue.showsNetworkActivityIndicatorWhenBusy = YES;

        // Start processing!
        [queue start];
        _mainDownloadRequestQueue = [queue retain];
    }
    return _mainDownloadRequestQueue;
}

そして、主なメソッドは次のようになる可能性があります/そうあるべきです。ダウンロードを処理するためにキューが利用可能であることがRestKitによってチェックされる直前に、ブロックにキューを設定します。

    - (void)setUpMainQueue {
        // We lock the download queue so that, no download will start until, we want it
        [[self mainDownloadRequestQueue] setSuspended:YES];

        // Fill up the queue
        [self fillQueueWithMandatoryDownloads];

        // No, let's start and wait for data to be there
        [[self mainDownloadRequestQueue] setSuspended:NO];
    } 

    - (void)fillQueueWithMandatoryDownloads {
        // Add the first request
        [self addLanguagesRequest];

        // Add another request
        [self addLanguagesRequest];

        // … Add any other request
    }

    - (void)addLanguagesRequest {
        // Load the object model via RestKit
        RKObjectManager *objectManager = [RKObjectManager sharedManager];
        objectManager.client.baseURL = [RKURL URLWithString:kFoundationHost];

        __unsafe_unretained OMResourceLoader * wSelf = self;
        [objectManager loadObjectsAtResourcePath:@"/sources/api/languages" usingBlock:^(RKObjectLoader * loader) {
            // Set the queue there, this is the one defined
            loader.queue = [wSelf mainDownloadRequestQueue];

            // Do other configuration or behaviour for that
            loader.onDidLoadObjects = ^(NSArray *objects) {
                [[OMLogManager sharedLogManager] log:[objects description] logLevelParam:OM_LOG_LEVEL_INFO exceptionParam:nil errorParam:nil];
            };
        }];
    }

    - (void)addCategoriesRequest {
        // Load the object model via RestKit
        RKObjectManager *objectManager = [RKObjectManager sharedManager];
        objectManager.client.baseURL = [RKURL URLWithString:kFoundationHost];

        __unsafe_unretained OMResourceLoader * wSelf = self;
        [objectManager loadObjectsAtResourcePath:@"/sources/api/categories" usingBlock:^(RKObjectLoader * loader) {
            // Set the queue
            loader.queue = [wSelf mainDownloadRequestQueue];
            loader.onDidFailLoadWithError = ^(NSError * error) {
                [[OMLogManager sharedLogManager] log:@"Categories loading error" logLevelParam:OM_LOG_LEVEL_ERROR exceptionParam:nil errorParam:error];
            };
            loader.onDidFailWithError = ^(NSError * error) {
                [[OMLogManager sharedLogManager] log:@"Categories loading error" logLevelParam:OM_LOG_LEVEL_ERROR exceptionParam:nil errorParam:error];
            };
            loader.onDidLoadResponse = ^(RKResponse *response) {
                [[OMLogManager sharedLogManager] log:[[response bodyAsString] description] logLevelParam:OM_LOG_LEVEL_INFO exceptionParam:nil errorParam:nil];
            };
            loader.onDidLoadObjects = ^(NSArray *objects) {
                [[OMLogManager sharedLogManager] log:[objects description] logLevelParam:OM_LOG_LEVEL_INFO exceptionParam:nil errorParam:nil];
            };
        }];
    }
于 2012-10-27T19:51:35.643 に答える