4

次の構成で新しい NSURLSession を作成します

 if (!self.session) {
            NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:[self uniquieIdentifier]];
            config.discretionary = NO;
            self.session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        }

ボタンを押した後、現在のすべてのダウンロードタスクを停止しようとしています。

[[[self session] delegateQueue] setSuspended:YES];
[[self session] invalidateAndCancel];

それにもかかわらず、デリゲート メソッド didFinishDownloadingToURL で応答を受け取ります。この時点以降、新しいセッションやダウンロード タスクが作成されないことは確かです。すべてのタスクが発生しないようにする方法は?

4

2 に答える 2

16

キューとその識別子が無効のままになり、デバイス全体をリセットするまで再利用できないため、invalidateAndCancel メソッドの使用はお勧めしません。

NSURLSession クラスのリファレンス

このコードを使用して、保留中のすべてのタスクをキャンセルします。

- (void) cancelDownloadFiles
{

    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {

        for (NSURLSessionTask *_task in downloadTasks)
        {
            [_task cancel];

            id<FFDownloadFileProtocol> file = [self getFileDownloadInfoIndexWithTaskIdentifier:_task.taskIdentifier];

            [file.downloadTask cancel];

            // Change all related properties.
            file.isDownloading = NO;
            file.taskIdentifier = -1;
            file.downloadProgress = 0.0;

        }

    }];

    cancel = YES;
}
于 2014-11-24T15:30:46.433 に答える
2

これは予想される動作です。セッションでタスクをキャンセルしても、引き続きデリゲート メソッドが呼び出される可能性があります。

指定されたタスクの状態を確認しましたか? である必要がありますNSURLSessionTaskStateCanceling

于 2014-01-31T01:53:37.393 に答える