0

AFNetworking を使い始めたばかりですが、これまでのところ、Web からデータを取得するだけでうまくいきました。

しかし今、デバイスにダウンロードする必要があるファイルのリストがあります

for(NSDictionary *issueDic in data)
{
    Issue *issue = [[Issue alloc] init];
    ...
    [self getOrDownloadCover:issue];
    ...
}

getOrDownloadCover:issue は、ファイルが既にローカルに存在するかどうかをチェックし、存在する場合はそのパスを保存し、存在しない場合は指定された URL からファイルをダウンロードします

- (void)getOrDownloadCover:(Issue *)issue
{
    NSLog(@"issue.thumb: %@", issue.thumb);

    NSString *coverName = [issue.thumb lastPathComponent];

    NSLog(@"coverName: %@", coverName);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    __block NSString *filePath = [documentsDirectory stringByAppendingPathComponent:coverName];

    if([[NSFileManager defaultManager] fileExistsAtPath:filePath])
    {
        // Cover already exists
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    }
    else 
    {
        NSLog(@"load thumb");

        // Download the cover
        NSURL *url = [NSURL URLWithString:issue.thumb];
        AFHTTPClient *httpClient = [[[AFHTTPClient alloc] initWithBaseURL:url] autorelease];
        NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:issue.thumb parameters:nil];

        AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
        operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"FAILED");
    }];
        [operation start];
    }
}

getOrDownloadCover:issue は連続して 20 回呼び出すことができるので、すべてのリクエストをキューに入れる必要があります。キューが完了しても、パスを保存できるはずです (または通知を送信するだけです。私はすでにパスが何であるかを知っています)

これに関する提案はありますか?

4

2 に答える 2

2

NSOperationQueueappDelegateなど、アプリケーションの任意の時点でインスタンスを取得できるオブジェクトにを追加します。AFHTTPRequestOperation次に、次のようにこのキューにを追加します。

[[(AppDelegate *) [UIApplication sharedApplication].delegate operartionQueue] addOperation:operation];

完了ブロックでの保存を処理するだけです。メインスレッドでこのブロックからメソッドを呼び出すか、を投稿しNSNotificationます。

メインスレッドを呼び出すには、GCDを使用します。

dispatch_async(dispatch_get_main_queue(), ^{
    // Call any method from on the instance that created the operation here.
    [self updateGUI]; // example
});
于 2012-07-26T09:19:24.907 に答える
0

これが役立つかどうかはわかりませんが...

独自の operationQueue を使用する代わりに、AFHTTPClient の operationQueue を使用できます。enqueueHTTPOperation を使用して単一の操作をキューに入れるか、enqueueBatchOperations を使用して操作の配列をキューに入れます (メモリからこれらのメソッド名を思い出していますが、少しずれている可能性があります)。

各操作に固有のデータを保存する限り、AFHTTPRequestOperation をサブクラス化し、保存するパスのプロパティを設定できます。このようなもの。

于 2013-01-31T16:40:11.330 に答える