NSOperation + NSURLConnection

NSOperation + NSURLConnection

我创建了 NSOperation class class 我正在调用 NSURLConnection 来获取一些数据。 我在 NSOperation class 中使用主线程调用 NSURLConnectionNSURLConnection 的委托设置为 NSOperation class 对象。 来自 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 ....
}

你说你"want to perform parsing of response data on operation thread."你真的需要运行它在操作线程上,还是只需要把它从主线程?操作队列不一定有一个专用的线程,所以这个问题没有多大意义。 (这是调度队列和操作队列的优点之一,它为我们管理线程,我们通常不必参与这些细节。)

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

顺便说一句,如果您确实需要,您可以为 NSURLConnection 委托调用创建一个专用线程,并在该线程上安排连接,但这通常有点矫枉过正。但是请参阅 AFNetworking 代码以获取此实现的示例。 How do I start an Asychronous NSURLConnection inside an NSOperation?

中对此进行了说明