NSOperation и перезагрузка парсера - PullRequest
0 голосов
/ 02 июня 2011

У меня есть класс анализатора, который является подклассом NSOperation. Он используется для анализа xml, и представление таблицы перезагружается после завершения анализа. У меня есть обновленный UIBarButtonItem, который используется для вызова синтаксического анализатора и синтаксического анализа нового XML из ссылки снова.

-(void)refresh {
   [self.queue cancelAllOperations]; //cancel all the current operations
   [self.queue release];
   self.queue=nil;
   self.arrayOfAllPhotos = nil; // The array to load table view
   [self performSelectorOnMainThread:@selector(doItAgain) withObject:nil waitUntilDone:NO];

}

-(void)doItAgain {
   [tableView reloadData];
   NSURL *url = [NSURL URLWithString:@"some url"];
   NSURLRequest *request = [NSURLRequest requestWithURL:url];
   NSURLConnection *aconnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
   self.myConnection = aconnection;
   [aconnection release];   

}

Но при нажатии кнопки обновления приложение вылетает без сообщения. Как мне освободить NSOperationQueue и снова начать новый синтаксический анализ для загрузки данных?

Ответы [ 3 ]

1 голос
/ 02 июня 2011

, если очередь определена как сохраняемое свойство, то здесь:

   [self.queue release];
   self.queue=nil;

вы перевыпускаете очередь: сначала она освобождается вручную, затем в методе setter, поскольку очередь по-прежнему не равна нулю и отличается от нуля, она будет снова освобождена и установлена ​​на ноль, а вторая разблокировка вызовет сбой.

этого будет достаточно:

   self.queue=nil;
1 голос
/ 02 июня 2011

Вы должны быть осторожны после вызова cancelAllOperations, это асинхронная операция.Самый простой способ убедиться, что все операции были отменены, сделать что-то вроде:

[self.queue cancelAllOperations]
[self.queue waitUntilAllOperationsAreFinished];
1 голос
/ 02 июня 2011

Ваше управление памятью нарушено.И вы нарушаете инкапсуляцию.Вы звоните [self.queue release].Это проникает в self и разрушает его, высвобождая что-то, что self принадлежит.

Если бы я полез в твой живот и выпустил твою печень, это могло бы быть все во благо страны, но этовероятно, будет плохо для вас.Эта концепция известна как инкапсуляция.Концепция объясняется здесь .

Нарушение инкапсуляции вредно по ряду причин и плохо для self здесь.

Вместо этого просто позвоните self.queue = nil иsetQueue: метод выдаст queue для вас, когда наступит подходящее время (точно так же, как и для arrayOfPhotos).

[self.queue cancelAllOperations];
self.queue = nil;
self.arrayOfAllPhotos = nil;

Делая шаг назад от подробностей этой проблемы, кажется, что выможет также потратить некоторое время на более глубокое понимание парадигмы MVC.Разговор WWDC 2010 (название сессии: Model-View-Controller для iPhone OS) о нем был фантастическим и его можно найти здесь (вы должны войти в систему).

Обычно этоплохая идея объединять сети с вашим контроллером табличного представления.

Удачи!

...