1

私のアプリケーションでは、ファイルのダウンロードにASINetworkQueueメソッドを使用しています。ボタンの数はn個あり、ボタンをクリックするたびに、複数のリクエストで異なるキューが作成され、非同期でダウンロードが開始されます(複数のダウンロード)。正常に動作していますが、各キューがいつ完了するかを追跡できませんでした。利用した、

        [self.myQueue cancelAllOperations];
        [self.myQueue setDownloadProgressDelegate:currentProgress];
        [self.myQueue setDelegate:self];
        [self.myQueue setShowAccurateProgress:YES];
        [self.myQueue setRequestDidFinishSelector:@selector(requestFinished:)];
        [self.myQueue setQueueDidFinishSelector:@selector(queueComplete:)];

として追加されたリクエスト、

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:str]];
                            [request setDownloadProgressDelegate:currentProgress];
                            [request setShowAccurateProgress:YES];   
                            [request setDelegate:self];
                            [request shouldContinueWhenAppEntersBackground];
                            [request allowResumeForFileDownloads];
                            [request startAsynchronous];
                            [self.myQueue addOperation:request];

そして最後に [self.myQueue go]; 、デリゲートメソッドは

- (void)queueComplete:(ASINetworkQueue *)queue
{
   NSLog(@"Queue completed");
}

しかし、それは最後には呼び出されません。ここで何が悪かったのですか?何か案が?また、同時に実行している複数のキューがある場合、どのキューが最後に完了したかをどのように区別できますか?

編集:

   - (void)download{
    UIImageView *image = (UIImageView *)[mainView viewWithTag:selectedTag];
    for (UIProgressView *currentProgress in [image subviews]) {
        if ([currentProgress isKindOfClass:[UIProgressView class]]) {
            NSLog(@"Prog tag: %d",currentProgress.tag);
            if(currentProgress)
            {
                currentProgress.progress = 0.0;
                [[self myQueue] cancelAllOperations];
                [self setNetworkQueue:[ASINetworkQueue queue]];
                [[self myQueue] setDownloadProgressDelegate:currentProgress];
                [[self myQueue] setDelegate:self];
                [[self myQueue] setShowAccurateProgress:YES];
                ASIHTTPRequest *request;
                [myQueue setQueueDidFinishSelector:@selector(queueComplete:)];
                for (int h = 0; h < [urlArray count]; h++) {
                    request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:[urlArray objectAtIndex:h]]];
                    [[self myQueue] addOperation:request];
                }
                [[self myQueue] go];
            }
        }
    }
}
4

1 に答える 1

1

キューに追加する前にリクエストを開始しています。

[request startAsynchronous];

リクエストの開始は、キューによってのみ処理される必要があります。したがって、その行を削除すると、完全なコールバックが呼び出されます。

複数のキューがある場合は、各キューへの参照を保持する必要があります。それらをNSMutableArrayに入れることができます。次に、完全なコールバックで、配列内のキューと照合することにより、どのキューが完了したかを確認できます。

編集:

myQueueiVarを設定するのを忘れているようです。そのため、nilすべてのメソッド呼び出しが無視されました。したがって、次を追加します。

self.myQueue = [ASINetworkQueue queue];

配列に複数のキューを含めるには:

self.queues = [NSMutableArray array] // queues is a retained property
ASINetworkQueue *queue = [ASINetworkQueue queue];
[queues addObject:queue];
于 2012-05-22T07:27:35.877 に答える