2009-11-09 2 views
0

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

  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 блоков, но я не совсем уверен, где мне придется это точно указать (во многих местах кода доступен доступ к массиву). Другой вопрос: где мне придется обрабатывать исключения, которые могут быть выбраны блоками @synchronized? Это может привести к избыточному коду.

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

Любая идея, как решить эту проблему? Спасибо заранее.

ответ

0

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

+0

На самом деле я хотел бы реализовать нечто похожее на приложение Tweetie. Я обнаруживаю, когда пользователь достигает конца UITableView (последний UITableViewCell), и автоматически запускается новый парсер. В этот момент к истории могут быть доступны одновременно (как синтаксический анализатор, так и UITableView (если пользователь прокручивается)), где может возникнуть проблема. –

3

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

на быстрый взгляд, как бы я решить это:

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

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