私はNSOperation
を使用してダウンロードする必要があるデータを収集します(2〜5秒かかる)し、その後ダウンロードします。以前に収集したデータのダウンロードを開始するには、このNSOperation内にASINetworkQueueを配置しました。ASINetworkQueue NSOperationブロッキングメインスレッド内
すべて正常に動作しますが、ASINetworkQueue
にcancelAllOperations
と電話すると、メインスレッドがブロックされ、UIがフリーズします。なぜこうなった?それ以外はうまく動作します。ここで
は私のコードです:あなたの失敗のデリゲートメソッドは
- (void)main {
//ManagedObjectContext for operations
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
[self.managedObjectContext setPersistentStoreCoordinator: [appDelegate persistentStoreCoordinator]];
// Register context with the notification center
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:self.managedObjectContext];
[self startDownload];
if (!self.downloadDidFail) {
[self moveFiles];
[self.managedObjectContext save:nil];
}
}
- (void)startDownload {
self.downloadQueue = [ASINetworkQueue queue];
self.downloadQueue.delegate = self;
[self.downloadQueue setRequestDidFailSelector:@selector(dataRequestFailed:)];
[self.downloadQueue setRequestDidFinishSelector:@selector(dataRequestFinished:)];
[self.downloadQueue setQueueDidFinishSelector:@selector(dataQueueFinished:)];
[self.downloadQueue setShouldCancelAllRequestsOnFailure:YES];
[self.downloadQueue setDownloadProgressDelegate:self.progressView];
for (File *dataFile in self.dataFiles) {
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:dataFile.url]];
[request setDownloadDestinationPath:dataFile.path];
[self.downloadQueue addOperation:request];
}
}
[self.downloadQueue go];
[self.downloadQueue waitUntilAllOperationsAreFinished];
}
- (void)dataRequestFinished:(ASIHTTPRequest *)request {
NSLog(@"DL finished");
}
- (void)dataRequestFailed:(ASIHTTPRequest *)request {
DLog(@"Download failed");
self.downloadDidFail = YES;
}
- (void)dataQueueFinished:(ASINetworkQueue *)queue {
DLog(@"Finished Data Queue");
}
- (void)cancelDownload {
self.canceledDownload = YES;
[self.downloadQueue cancelAllOperations];
}
内部 'ASINetworkQueue'(' NSOperationQueue'のサブクラス)を入れて、異常なパターンと思われます「NSOperation」。 – paulbailey
珍しいかもしれませんが、間違っていますか?私はそれが私の問題に対する最もクリーンな解決策だと思う。リクエストをロードしてからダウンロードしてください。私がこれをやっているのは、たくさんのリクエストを作成しなければならないし、ダウンロードするファイル名をロードするのに3〜4秒かかるからです。 – MoFuRo
個人的に私は1つのキューを使い、 'NSOperation'は、別のキューを作成するのではなく、同じキューに操作を追加します。 ASINetworkQueueを設定するために使用するコードを表示できますか? – paulbailey