0

我正在开发一个 RSS 阅读器,它使用 NSMutableArray ( _stories ) 来存储 RSS Feed 的内容。该数组被应用程序中的两个不同线程使用,并且可以在两种情况下同时访问,因为:

  1. 它是 UITableViewController 的数据源(读取它的内容并向用户显示所需的信息)
  2. XMLParser 使用它(从 Internet 下载内容,解析 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 Feed 加载“更多帖子”,我将开始另一个解析操作,将_stories数组作为对解析器的引用,它将其他“帖子”附加到数组中。解析结束时,调用 UITableViewController 方法reloadData,然后更新 UITableView。

如果用户在解析运行时向上/向下滚动 UITableView 怎么办?UITableViewController 是否会尝试同时访问_stories数组(以创建单元格)并可能使应用程序崩溃(它很少发生但会发生)?

我想到了使用 @synchronized 块的想法,但我不太确定我必须把它准确地放在哪里(在代码的许多地方都可以访问_stories数组)。另一个问题是:我必须在哪里处理 @synchronized 块可能引发的异常?这可能会导致大量冗余代码。

我也想在没有“非原子”的情况下使用@property,但我认为它不太适合这个问题。

知道如何解决这个问题吗?提前致谢。

4

2 回答 2

3

我刚刚发现了这一点,我怀疑您是否仍在寻找答案,但也许这对其他人有用:)

快速浏览一下,我将如何解决这个问题:

  • 让新的解析在后台线程中运行,并将此加载到另一个数组中。
  • 当新数组已加载并且您拥有所有数据时,在主线程上运行一个方法,将新数组添加到您的 _stories 数组中,然后告诉 UI 刷新。

您现在已经安全地更新了 _stories 数组并显示了它,没有任何并发​​访问数组的风险。

于 2010-04-26T22:55:48.113 回答
0

为什么不制作更多帖子模式并显示活动指示器?毕竟如果用户选择“更多帖子”,她愿意接受一定的加载时间

于 2009-11-09T19:56:40.923 回答