Я разрабатываю программу чтения RSS, которая использует NSMutableArray ( _stories ) для хранения содержимого канала RSS. Этот массив используется двумя различными потоками в приложении и может быть доступен одновременно в двух случаях, поскольку:
- Это источник данных UITableViewController (который читает его содержимое и показывает необходимую информацию пользователю)
- Он используется 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", но не думаю, что он хорошо подходит для этой проблемы.
Есть идеи, как это решить?
Заранее спасибо.