繁体   English   中英

NSoperationQueue阻塞主线程

[英]NSoperationQueue blocking main thread

因此,显然我在这里做错了。 我有一个使用MVC的应用程序,在一个模型类中,我有一个对Web服务的调用,这可能需要一些时间来处理。 视图控制器调用模型类中的方法,该方法开始下载过程。 通过放置在NSOperationQueue中的AFHTTPRequestOperation执行下载过程。 整个下载过程发生在视图控制器外部的模型类中。 但是,由于操作期间UI变得无响应,因此下载操作似乎阻塞了主线程。 我已经对暂停进行了硬编码,以模拟慢速网络。 操作完成后,它将通过委托方法调用视图控制器。 这段代码有效,但是正如我提到的,它阻塞了主线程。

在我的模型类(StreamGauge)中,我具有以下内容:

-(void)getGaugeReadings{

    NSString *endpointURL = [NSString stringWithFormat:@"http://...", stationID_, timeSpan_];

    NSURL *url = [NSURL URLWithString:endpointURL];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){
        NSData *data = (NSData*)responseObject;
        [self processXmlObject:data];
        [self setGaugeFlowKeys:[self getFlowKeys]];
        [NSThread sleepForTimeInterval:3];
        [self.delegate updateGaugeTable];
    }failure:^(AFHTTPRequestOperation *operation, NSError *err){
        NSLog(@"ERROR: %@", [err localizedDescription]);
    }];

    NSOperationQueue *gaugeDownloadQueue = [[NSOperationQueue alloc] init];
    [gaugeDownloadQueue setName:@"Gauge_Download"];
    [gaugeDownloadQueue addOperation:operation];
}

在我的视图控制器中,我的viewDidLoad(具有硬编码参数)具有以下内容:

- (void)viewDidLoad
{
    [super viewDidLoad];
    gauge = [[StreamGauge alloc] initWithStationID:@"A3185AX400" forTimeSpan:24];        
    [gauge setDelegate:self];
    [gauge getGaugeReadings];
}

我更习惯于将GCD用于此类操作,但是现在我需要能够在超时到期后取消操作,因此NSOperationQueue更合适,但是显然我对操作队列缺乏透彻的了解是一个问题。

将此后台操作放在模型类中会不会有问题? 后台操作是否应该始终在控制器类中? 我在这里做错了什么吗?

问题是您没有保留gaugeDownloadQueue 因此,它只是在烟雾中消失,一切都发生在主线程上。 (而且您将无法取消任何操作,因为您没有引用任何操作队列。)

您需要将gaugeDownloadQueue保留在持久引用中(例如,实例变量/属性)。 否则,它对您毫无用处,而不仅仅是一种。

另外,您的AFHTTPRequestOperation完成块在哪个线程上被调用? 如果它是后台线程,并且您正在对接口做一些事情(例如,对updateGaugeTable的调用肯定会引起麻烦)。 您正在使用NSOperation的事实并不能完全免除您担心正在使用哪个线程的责任。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM