2015-01-09 2 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' и 'isExecuting' и' fetchData' происходят независимо от того, был ли op отменен или нет, что не то, что вы намеревались, я уверен). Кроме того, начиная с iOS 7, вы также должны реализовать 'isAsynchronous'. – Rob

+0

О да ... большой улов ..thanks ... –

ответ

1

Вы говорите, что «хотите выполнить разбор данных ответа на поток операций». Вам нужно действительно нужно запустить его на рабочий поток, или вам просто нужно снять его с основного потока? Очередь операций не обязательно имеет отдельный выделенный поток, поэтому вопрос не имеет смысла. (Это одна из красавиц диспетчерских очередей и очередей операций, что она управляет потоками для нас, и мы, как правило, не должны участвовать в этих деталях.)

Если вы просто хотите, чтобы код в connectionDidFinishLoading запускался фоновый поток (если, например, вы делаете что-то чрезвычайно медленное в этом методе делегата), просто отправьте его в фоновый поток (для этого вы можете использовать для этого глобальную очередь). Если вам нужна последовательная очередь для этих вызовов connectionDidFinishLoading, создайте для этого свою собственную последовательную очередь и отправьте этот код в эту очередь. Но если это не слишком интенсивно с вычислительной точки зрения (например, разбор JSON или что-то в этом роде), вы можете просто позволить ему запускать основной поток без инцидентов.

Как вы можете, если хотите, создайте выделенный поток для своих делегатов NSURLConnection и назначьте подключение к этому потоку, но это, как правило, избыточно. Но см. Код AFNetworking, например, об этой реализации. Это проиллюстрировано в How do I start an Asychronous NSURLConnection inside an NSOperation?

+0

Требуется ли nsurlconnection, используя nsoperation ?? Nsurl-соединение само по себе работает на фоновом потоке. Возможно, это будет фактическое использование .. Было бы здорово, если бы вы могли предоставить более подробную информацию о том, как создать специальную нить для делегирования соединения .... –

+0

«Требуется ли вызвать nsurlconnection, используя nsoperation? " Нет, конечно нет. Вы должны сделать это, если хотите воспользоваться некоторыми преимуществами «NSOperation» (например, скомпонованные объекты для каждого запроса, сдерживая степень параллелизма в очереди, зависимостях и т. Д.), Но если вам это не нужно, t используйте 'NSOperation' и' NSOperationQueue'. Вы тот, кто сказал, что вы хотите обернуть его в «NSOperation», поэтому я предполагаю, что у вас есть причина. (Лично я всегда это делаю, но многие люди этого не делают.) – Rob

+0

Что касается создания выделенного потока для 'NSURLConnection', вы можете это сделать, но _why? _ Как вы заметили, он уже запускается асинхронно, независимо от того, с какого потока вы его запускаете , поэтому, если вы хорошо разбираетесь в том, чтобы не блокировать основной поток (и вы все равно должны это делать), это не проблема. Но если вам это нужно, вы можете обратиться к http://stackoverflow.com/a/17427268/1271826. Но лично я просто использую главную очередь в настоящее время. – Rob