【问题标题】:NSOperation + NSURLConnectionNSOperation + NSURLConnection
【发布时间】:2015-01-09 12:20:05
【问题描述】:

我在那个类中创建了NSOperation 类,我调用NSURLConnection 来获取一些数据。 我正在使用NSOperation 类中的主线程调用NSURLConnectionNSURLConnection 的委托设置为 NSOperation 类对象。 来自NSURLConnection 的调用来自主线程。 我需要使用相同的操作线程处理这些数据。我如何做到这一点?

@implementation  ModelCreationSearchOperation {
    int try;
}

- (BOOL)isConcurrent
{
    return YES;
}

- (void)start
{
    [self willChangeValueForKey:@"isExecuting"];
    _isExecuting = YES;
    [self didChangeValueForKey:@"isExecuting"];

    dispatch_async(dispatch_get_main_queue(), ^{
        if (self.isCancelled) {
            [self finish];
            return;
        }
    });

    [self fetchData];
}

-(void)fetchData {
    dispatch_async(dispatch_get_main_queue(), ^{
        self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    });
}

- (void)finish
{
    [self willChangeValueForKey:@"isExecuting"];
    [self willChangeValueForKey:@"isFinished"];

    _isExecuting = NO;
    _isFinished = YES;

    [self didChangeValueForKey:@"isExecuting"];
    [self didChangeValueForKey:@"isFinished"];

    [self cancel];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    //Main thread
    //Want to perform parsing of response data on operation thread ....
}

【问题讨论】:

  • 顺便说一句,与您手头的问题无关,isCancelled 逻辑不太正确。您应该在设置isExecuting 并调用fetchData 之前检查这一点。将它分派到主队列也没有意义(而且它会适得其反,因为您的 return 应该阻止提取发生,但是现在您只是从分派中返回,但是 isExecuting 和 @无论操作是否取消,都会发生 987654334@,我敢肯定,这不是您想要的)。另外,从 iOS 7 开始,你也应该实现 isAsynchronous
  • 哦,是的……很棒的收获……谢谢……

标签: ios macos cocoa nsurlconnection nsoperation


【解决方案1】:

您说您“想要在操作线程上执行响应数据的解析”。您真的需要在操作线程上运行它,还是只需要从主线程中取出它?操作队列不一定有一个单独的专用线程,所以这个问题不太有意义。 (这是调度队列和操作队列的优点之一,它为我们管理线程,我们通常不必参与这些细节。)

如果您只是希望 connectionDidFinishLoading 中的代码在后台线程上运行(例如,如果您在此委托方法中执行的操作异常缓慢),只需将其分派到后台线程(您可以使用全局队列)。如果您想要这些connectionDidFinishLoading 调用的串行队列,请为此创建您自己的串行队列并将此代码分派到该队列。但如果计算量不是太大(例如解析 JSON 或类似的东西),您通常可以让它在主线程上运行而不会发生任何事故。

顺便说一句,如果您真的愿意,可以为您的NSURLConnection 委托调用创建一个专用线程,并在该线程上安排连接,但这通常是多余的。但请参阅 AFNetworking 代码以了解此实现的示例。这在How do I start an Asychronous NSURLConnection inside an NSOperation?中进行了说明

【讨论】:

  • 是否需要使用nsoperation调用nsurlconnection?? Nsurl 连接本身在后台线程上运行..实际用途可能是什么??..如果您能提供有关如何为 urlconnection 委托创建特殊线程的更多详细信息,那就太好了..谢谢...
  • "是否需要使用nsoperation调用nsurlconnection?"不,当然不。如果您想享受NSOperation 的一些好处(例如,每个请求都包含好的​​对象、限制队列的并发程度、依赖项等),您应该这样做,但如果您不需要,请不要这样做不要使用NSOperationNSOperationQueue。你是那个说你想把它包装在NSOperation 中的人,所以我认为你是有原因的。 (就个人而言,我总是这样做,但很多人不这样做。)
  • 关于为NSURLConnection创建专用线程,您可以这样做,但是为什么? 正如您所指出的,无论您从哪个线程启动它,它都已经异步运行,因此,如果您擅长不阻塞主线程(无论如何您都应该这样做),那么这不是问题。但是如果你真的需要这样做,你可以参考stackoverflow.com/a/17427268/1271826。但就个人而言,我现在只使用主队列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2012-09-19
  • 1970-01-01
相关资源
最近更新 更多