私は NSOperation にやや慣れていません。長時間実行される可能性のあるタスクを含む既存のアプリがあります。このタスクは、Web サービスを介してデータをダウンロードします。特に接続が遅い地方では、タスクが完了するまでに時間がかかる場合があります。ユーザーがダウンロードをキャンセルできるように、または自動的にタイムアウトできるように、このアプリを更新する必要があります。
現在、GCD を使用してダウンロードを実行していますが、GCD 操作をキャンセルすることはできません。データをダウンロードするクラスは変更されず、長時間実行される操作として扱われることが望ましいです。そのオブジェクトの初期化子は Web サービス データを取得し、完了すると戻ります。
NSInvocationOperation を使用するか、NSOperation のサブクラスを使用するかがわかりません。タスクは非常に単純で、操作のキャンセルを許可するだけです。
MBProgressHUD はアクティビティ インジケーターとして使用され、ユーザーがタップして操作をキャンセルできるように使用されるジェスチャ認識機能を備えています。さらに、操作はタイムアウトを提供する必要があります。操作が完了すると、UI が変更されます。
現在の GCD コード:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{
// long running operation
GaugeList *rg = [[GaugeList alloc] initWithStationInfo:[station id] forHistoryInHours:48 inThisFormat:nil];
dispatch_async(dispatch_get_main_queue(), ^{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
GaugeViewController *vc = [sb instantiateViewControllerWithIdentifier:@"GaugeDetailViewController"];
[vc setRiverGauge:rg];
[self.navigationController pushViewController:vc animated:YES];
[hud removeFromSuperview];
});
迅速な解決策を探していますが、私が見たほとんどの例は非常に長く、大幅なリファクタリングが必要になる場合があります。これに対する解決策を提供する例を誰か指摘できますか? どうも!});