それで、ここに私の質問があります。
私がやりたいことは、リソースの読み込みをキューに入れることです。すべてのリソース要求の読み込みが一度に 1 つずつ行われるようにします (これらのリソースを受け取る順序を制御します)。
そのような動作を完了するための正しくてクリーンな方法は何でしょうか?
わかりました、私はそれを手に入れたと思います。
RKObjectLoader
はRKRequest
オブジェクトのサブクラスです。したがって、カスタマイズされた に関連付けられている可能性がありますRKRequestQueue
。RKRequestQueue
に 1 つの要素のみを処理できるように構成して、順序付けを行うことができます。同時実行数を 1 に設定する。私は擬似コードを持っています:
RKRequestQueue
その同時実行数を 1 に定義します。リクエストキューの遅延読み込みから始めます
- (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];
};
}];
}