NSMutableArray ( _stories ) を使用して RSS フィードのコンテンツを保存する RSS リーダーを開発しています。この配列は、アプリケーション内の 2 つの異なるスレッドによって使用されており、次の理由から、2 つの場合に同時にアクセスされる可能性があります。
- 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 ブロックを使用するというアイデアについては考えましたが、どこに正確に配置する必要があるかはよくわかりません ( _stories配列は、コードの多くの場所でアクセスされます)。もう 1 つの質問は、@synchronized ブロックによってスローされる可能性のある例外をどこで処理する必要があるかということです。これにより、多くの冗長なコードが発生する可能性があります。
「非アトミック」なしで @property を使用することについても考えましたが、この問題にはあまり適していないと思います。
これを解決する方法はありますか?前もって感謝します。