线程安全的NSMutableArray问题

时间:2009-11-09 19:48:31

标签: uitableview nsmutablearray nsthread

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

  1. 它是UITableViewController的数据源(读取内容并向用户显示所需信息)
  2. 它由XMLParser使用(从Internet下载内容,解析XML数据并将内容添加到其中)。
  3. 下面显示了一些代码:

    在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,但我认为它不适合这个问题。

    如何解决这个问题? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

我刚发现这一点,我怀疑你还在寻找答案,但也许这对其他人有用:)

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

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

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

答案 1 :(得分:0)

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