これはすでに誰かに発生していると確信していますが、これを解決するための信頼できるソース (Stackoverflow または他の場所) を見つけることができませんでした。
(有限の) 数のファイルをダウンロードする必要があります。ダウンロードする前にサイズがわかりません。それらのサイズは大きく変化する可能性があり、ダウンロードを開始する前にはわかりません。
非常に小さなファイルが 9 つと、非常に大きなファイルが 1 つあることがよくあります。NSProgress
「子」機能を使用すると、非常に迅速に 90% の完了が表示され、最後のファイルがはるかに大きいため、UI がスタックしているように見えます (実際にはそうではありませんが)。
これは、大きなファイルをシミュレートするコードの例です。
- (void)viewDidLoad
{
[super viewDidLoad];
nbTasks = 10;
mainProgress = [NSProgress progressWithTotalUnitCount:nbTasks];
[self launch];
}
- (void)launch {
for (int i = 0; i < nbTasks; ++i) {
[mainProgress becomeCurrentWithPendingUnitCount:1];
[self launchWithNumber:i];
[mainProgress resignCurrent];
}
}
- (void)launchWithNumber:(int)count {
int max = count == 0 ? 100 : 10;
NSProgress *localProgress = [NSProgress progressWithTotalUnitCount:max];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
for (int i = 0; i < max; ++i) {
localProgress.completedUnitCount++;
[NSThread sleepForTimeInterval:1];
}
});
}
becomeCurrentWithPendingUnitCount
ダウンロードを開始する前に重量がわからないために を変更できない場合、どのように対処しますか?
編集:これは私が今のところやっていることです:
まず第一に:私は嘘をつきました。ファイルをダウンロードするのではなく、データベースからデータをダウンロードしますが、結局同じ問題です。
root を作成する前にNSProgress
、バックエンド ( ) から多数のオブジェクトをダウンロードしますSELECT count(*) FROM ...
。これにより、正しい「重み」で呼び出すことができbecomeCurrentWithPendingUnitCount
、進行がより「スムーズ」に表示されます。
もちろん、最初の を表示する前にしばらく待つ必要があるため、これは私にとって理想とはほど遠いものでNSProgress
あり、バックエンドに対してより多くのクエリを実行する必要がありますが、少なくともエクスペリエンスは少し向上しています。
これを取り除くことができれば、はるかに良いでしょう。何か案は?