ASINetworkQueue внутри NSOperation блокирует основной поток - PullRequest
0 голосов
/ 19 декабря 2011

Я использую NSOperation для сбора данных, которые должны быть загружены (занимает 2-5 секунд), а затем я загружаю это. Я поместил ASINetworkQueue в эту NSOperation, чтобы начать загрузку ранее собранных данных.

Все работает нормально, но когда я звоню cancelAllOperations на моем ASINetworkQueue, основной поток блокируется и пользовательский интерфейс зависает. Почему это происходит? Все остальное работает отлично.

Вот мой код:

- (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];
}

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

У меня была та же проблема, и я решил, позвонив:

[queue setShouldCancelAllRequestsOnFailure:NO]

перед звонком:

[queue cancelAllOperations].
0 голосов
/ 25 января 2012

ASI запрашивает ответы и ответы очереди намеренно перемещаются в основной поток для целей разработки библиотеки.У вас есть два решения: -подкласс ASIHTTPRequest и перезаписать 2 метода.(Ищите в коде что-то вроде «подкласс для основного потока»).Модифицировать библиотеку.(Легко, но лично мне не нравится это решение).

0 голосов
/ 19 декабря 2011

Что делает ваш метод делегата отказа? ASIHTTPRequest по умолчанию будет запускать его в основном потоке, поэтому, если он выполняет много обработки (или много запросов), это может занять довольно много времени.

...