0

私はAFNetworking自分のプロジェクトで使用しています。私が把握する必要がある主なことは、リモート サーバーからすべてのファイルが iOS デバイスの Document ディレクトリにロードされた瞬間をどのように検出できるかということです。

現在、私はこのアーキテクチャを持っています:

このメソッドにはサイクルがあり、新しい Zip ファイルをダウンロードするメソッドを呼び出します。-stopLoadサイクルが終了した直後に呼び出されるメソッドを見てください。以下の理由により:

- (void)startLoad {
    for (NSDictionary *item in items) {

       if ([self checkIfNeedUpdateQZTestModelWithItem:item]) {
          NSString *urlString = [item objectForKey:@"url"];

          NSNumber *updateID = [item objectForKey:@"update_id"];

          [self downloadZipFileWithUrlString:urlString andUpdateID:updateID];
        }
    }
    [self stopLoad];
}

- (void)downloadZipFileWithUrlString:(NSString *)urlString andUpdateID:(NSNumber *)updateId
{
    NetworkManagerBlock block = ^ {
        NSString *fileName = [self fileNameFromUrlString:urlString];
        FileManager *fileManager = [FileManager new];
        [fileManager unZipFileWithFileName:fileName andUpdateID:updateId];
    };

    [self downloadFileWithUrlString:urlString withCompletionBlock:block];
}

- (void)downloadFileWithUrlString:(NSString *)urlString withCompletionBlock:(NetworkManagerBlock)block
{
    NSURL *url = [NSURL URLWithString:urlString];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *fileName = [self fileNameFromUrlString:urlString];
    NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:fileName];

    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        block();

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"Error: %@", error);

    }];

    [operation start];
}

私が推測するように、すぐに呼び出す理由-stopLoadは非同期操作です。そのため、10 個または 20 個のファイルをダウンロードする必要がある場合、最後のファイルがいつダウンロードされるかわかりません。したがって、私の場合、-stopLoadメソッドは、サイクルの終了後に呼び出すすべての操作の完了について教えてくれません。

すべてのファイルがいつロードされたかを把握するには、操作スタックまたはこのようなものが必要だと思います。私は正しいですか?しかし、私はまだ正しい解決策について考えています。何か案は?ありがとう。

NSIntegervariableも追加しましoperationsCountた。operationsCount各ブロックで減少しsetCompletionBlockWithSuccess、変数値が-1に等しいかどうかを確認してから呼び出し-stopLoadて動作しますが、それは美しい解決策ではないと思います。

4

2 に答える 2

2

サーバーにダウンロードする量に関する情報を提供してもらいませんか? 次のような単純な API 呼び出しである可能性があります。

http://yoursever.com/fileList?user=johnDoe&filter=important

あなたに何かを与える

{
 "status": "OK",
 "fileList": ["file1", "file2", "file3"]
}

これで、ファイルをループして、stopLoad完了したらルーチンを呼び出すことができます。

于 2013-07-25T14:42:15.647 に答える
1

stopLoadすべてのリクエストが非同期的にロードしようとしている間に、同期的に呼び出されます。そのメソッドがそのように動作する場合、リクエストは開始直後にすべてキャンセルされます。

リクエスト操作のバッチが完了したときのハンドラーを取得するには、 を使用しますHTTPClient -enqueueBatchOfHTTPRequestOperationsWithRequests:progressBlock:completionBlock:

于 2013-07-25T14:43:19.710 に答える