首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSOperation阻塞主线程中的ASINetworkQueue

NSOperation阻塞主线程中的ASINetworkQueue
EN

Stack Overflow用户
提问于 2011-12-19 18:30:25
回答 3查看 834关注 0票数 0

我正在使用NSOperation收集应该下载的数据(需要2-5秒)。然后我下载了这个。我在这个NSOperation中放了一个ASINetworkQueue,用来开始下载以前收集的数据。

一切正常,但当我在ASINetworkQueue上调用cancelAllOperations时,主线程阻塞,UI冻结。为什么会发生这种情况?其他的一切都很好。

以下是我的代码:

代码语言:javascript
复制
- (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];
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-26 01:08:14

出于库设计的目的,ASI请求响应和队列响应被有意地移动到主线程。您有两个解决方案:-Subclass ASIHTTPRequest和overwrite 2方法。(在代码中查找类似于“主线程的子类”的内容)。对库执行-Modify操作。(很简单,但我个人不喜欢这个解决方案)。

票数 0
EN

Stack Overflow用户

发布于 2012-02-14 00:01:02

我也遇到了同样的问题,并通过调用以下命令来解决:

代码语言:javascript
复制
[queue setShouldCancelAllRequestsOnFailure:NO]

在调用之前:

代码语言:javascript
复制
[queue cancelAllOperations].
票数 2
EN

Stack Overflow用户

发布于 2011-12-19 19:51:10

你的失败委托方法是做什么的?默认情况下,ASIHTTPRequest会在主线程上运行,所以如果它做了很多处理(或者有很多请求),这可能需要相当长的时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8559995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档