0

私の問題はこれです:

ファイルのダウンロードについてProgressViewを表示したいのですが、何らかの理由でProgressViewが徐々に上昇し、すでにダウンロードされているファイルの量が表示され、ファイルがまだダウンロードされていない場合はすぐにいっぱいになります。何を修正する必要がありますか、またはそれを実装する方法は?

これが私のソースコードです:

- (IBAction)download:(id)sender {


    // Determile cache file path
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    progressSlider.progress = 0.0;

    for (i=0;i<=7;i++) {

        //Updating progressView and progressLabel
        progressLabel.text = [NSString stringWithFormat:@"Загружено: %d из 7",i];
        progressView.progress = (float)i/(float)7;

        NSString *filePath = [NSString stringWithFormat:@"%@/avto-0-%d.html", [paths objectAtIndex:0],i];

        // Download and write to file
        NSString *mustUrl = [NSString stringWithFormat:@"http://www.mosgortrans.org/pass3/shedule.php?type=avto&%@", [listOfAvtoUrl objectAtIndex:i]];
        NSURL *url = [NSURL URLWithString:mustUrl];
        NSData *urlData = [NSData dataWithContentsOfURL:url];


        [urlData writeToFile:filePath atomically:YES];
    }
 }
4

1 に答える 1

2

スレッドと、メインスレッドがビューを更新する方法に関連していると思います。

次の 2 つのケースが発生する可能性があります。

このメソッドを呼び出すとき、あなたはメインスレッドにいます

このような場合、メイン スレッドが更新ルーチンを実行することを許可しません。このすべてのダウンロードを GCD を使用してバックグラウンド キューに移動し、pt.2 で説明したようにメイン スレッドをコールバックします。

すべてをバックグラウンド キューに入れるには、次のように呼び出します。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ {
        // your download code goes here


    });

または、すでにバックグラウンド スレッドにいる場合は、次の行を使用してメイン スレッドにコールバックします。

dispatch_async(dispatch_get_main_queue(), ^ {
            progressView.progress = (float)i/(float)7;
        });

最終的な答え:

- (IBAction)download:(id)sender {

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ {
    // Determile cache file path
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    progressSlider.progress = 0.0;

    for (i=0;i<=7;i++) {

        //Updating progressView and progressLabel
        progressLabel.text = [NSString stringWithFormat:@"Загружено: %d из 7",i];
dispatch_async(dispatch_get_main_queue(), ^ {
        progressView.progress = (float)i/(float)7;
});

        NSString *filePath = [NSString stringWithFormat:@"%@/avto-0-%d.html", [paths objectAtIndex:0],i];

        // Download and write to file
        NSString *mustUrl = [NSString stringWithFormat:@"http://www.mosgortrans.org/pass3/shedule.php?type=avto&%@", [listOfAvtoUrl objectAtIndex:i]];
        NSURL *url = [NSURL URLWithString:mustUrl];
        NSData *urlData = [NSData dataWithContentsOfURL:url];


        [urlData writeToFile:filePath atomically:YES];
    }
});
 }
于 2012-11-22T12:47:32.037 に答える