2015-01-09 61 views
1

我已经创建了NSOperation类,我叫NSURLConnection获取一些数据。 我打电话NSURLConnection使用NSOperation类中的主线程。 NSURLConnection的代表设置为NSOperation类对象。 来自NSURLConnection的呼叫出现在主线程中。 我需要使用相同的操作线程处理这些数据。我如何实现这一目标?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 .... 
} 
+0

说明顺便说一句,与您的问题无关,'isCancelled'逻辑不太正确。在设置'isExecuting'并调用'fetchData'之前,你应该检查一下。将它分派到主队列是没有意义的(也是适得其反的,因为你的'return'应该阻止获取的发生,但是现在你只是从调度中返回,而'isExecuting'和' fetchData'正在发生,无论op是否被取消,这不是你想要的,我敢肯定)。另外,从iOS 7开始,你也应该实现'isAsynchronous'。 – Rob

+0

哦,是的......很棒的......感谢...... –

回答

1

你说你“想执行操作线程上的响应数据解析”。你真的需要运行它的操作线程,或者你只是需要把它从主线程?操作队列不一定只有一个专用线程,所以这个问题不太合理。 (它是调度队列和操作队列的美女之一,它为我们管理线程,我们通常不必涉及这些细节。)

如果您只是想让代码connectionDidFinishLoading运行一个后台线程(例如,如果您在这个委托方法中做的事情异常缓慢),只需将其分派到后台线程(您可以使用全局队列)。如果你想为这些connectionDidFinishLoading调用创建一个串行队列,请为此创建自己的串行队列,并将此代码发送到该队列。但是,如果它不是太计算密集型(例如解析JSON或类似的东西),你可以经常让它在主线程上运行而不会发生任何事情。另外,如果您真的想要,可以为您的NSURLConnection委托调用创建一个专用线程,并在该线程上安排连接,但这通常是矫枉过正的。但请参阅AFNetworking代码来了解此实现的示例。这是在How do I start an Asychronous NSURLConnection inside an NSOperation?

+0

是否需要使用nsoperation调用nsurlconnection? Nsurl连接本身运行在后台线程..WHat可能是实际使用?? ..这将是伟大的,如果你可以提供更多的细节,如何为urlconnection委托创建speacial线程..感谢... –

+0

“是否需要使用nsoperation调用nsurlconnection?“不,当然不。你应该这样做,如果你想享受'NSOperation'的一些好处(例如每个请求包含好的对象,限制队列上的并发程度,依赖等),但如果你不需要这样做,使用'NSOperation'和'NSOperationQueue'。你是那个说你想用'NSOperation'包装它的人,所以我认为你有一个理由。 (就我个人而言,我总是这样做,但很多人不这样做。) – Rob

+0

关于为'NSURLConnection'创建专用线程,你可以这样做,但_why?_正如你指出的那样,它已经异步运行,不管你从哪个线程启动它,所以如果你擅长不阻止主线程(无论如何你都应该这样做),这不是问题。但是,如果您真的需要这样做,可以参考http://stackoverflow.com/a/17427268/1271826。但个人而言,我现在只是使用主队列。 – Rob