Я разрабатываю RSS-ридер, который использует NSMutableArray (_stories) для хранения содержимого RSS-канала. Этот массив используется два различных потоками в применении и может быть доступен одновременно в двух случаях, так как:Thread-safe NSMutableArray вопрос
- Это данные источник 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 блоков, но я не совсем уверен, где мне придется это точно указать (во многих местах кода доступен доступ к массиву). Другой вопрос: где мне придется обрабатывать исключения, которые могут быть выбраны блоками @synchronized? Это может привести к избыточному коду.
Я также об использовании @property без «неатомического», но я не думаю, что он хорошо подходит для этой проблемы.
Любая идея, как решить эту проблему? Спасибо заранее.
На самом деле я хотел бы реализовать нечто похожее на приложение Tweetie. Я обнаруживаю, когда пользователь достигает конца UITableView (последний UITableViewCell), и автоматически запускается новый парсер. В этот момент к истории могут быть доступны одновременно (как синтаксический анализатор, так и UITableView (если пользователь прокручивается)), где может возникнуть проблема. –