Потокобезопасный вопрос NSMutableArray - PullRequest
0 голосов
/ 09 ноября 2009

Я разрабатываю программу чтения RSS, которая использует NSMutableArray ( _stories ) для хранения содержимого канала RSS. Этот массив используется двумя различными потоками в приложении и может быть доступен одновременно в двух случаях, поскольку:

  1. Это источник данных UITableViewController (который читает его содержимое и показывает необходимую информацию пользователю)
  2. Он используется XMLParser (который загружает контент из Интернета, анализирует данные XML и добавляет содержимое к нему).

Ниже показан фрагмент кода:

В классе UITableViewController

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    [_stories count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Update the Cell title, for example..
    [[cell title] setText:[[[_stories objectAtIndex: storyIndex] objectForKey: @"title"]];
}

В классе XMLParser

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName {    
    // after finished the parsing of an Item of the XML, add it "multi-threaded array"
    NSLog(@"[_stories addObject:_item]");
    [_stories addObject:_item];
}

Если пользователь хочет загрузить «Больше сообщений» из RSS-канала, я запускаю еще одну операцию разбора, передавая массив _stories в качестве ссылки на анализатор, который добавляет другие «сообщения» в массив. По окончании синтаксического анализа вызывается метод UITableViewController reloadData , а затем обновляется UITableView.

Что если пользователь прокручивает UITableView вверх / вниз во время анализа? Будет ли UITableViewController пытаться получить доступ к массиву _stories (для создания ячеек) одновременно и, возможно, вызвать сбой приложения (это происходит очень спорадически, но происходит)?

Я думал об идее использования @synchronized блоков, но я не совсем уверен, куда мне нужно его точно поместить (массив 1030 * _stories доступен во многих местах кода). Другой вопрос: где мне придется обрабатывать исключения, которые могут быть вызваны блоками @synchronized? Это может привести к большому количеству избыточного кода.

Я также хотел бы использовать @property без "nonatomic", но не думаю, что он хорошо подходит для этой проблемы.

Есть идеи, как это решить? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2010

Я только что заметил это, и я сомневаюсь, что вы все еще ищете ответ, но, возможно, это будет полезно для кого-то еще:)

Вкратце, как бы я решил это:

  • Запустите новый анализ в фоновом потоке и загрузите его в другой массив.
  • Когда новый массив был загружен и у вас есть все ваши данные, запустите метод в главном потоке, который добавляет новый массив в ваш массив _stories, а затем сообщает пользовательскому интерфейсу обновить.

Теперь вы благополучно обновили свой массив _stories и отобразили его без риска одновременного доступа к массиву.

0 голосов
/ 09 ноября 2009

Почему бы не сделать More Posts модальными и не показать индикатор активности? В конце концов, если пользователь выбирает «больше сообщений», он готов принять определенное время загрузки

...