0

NSMutableArray ( _stories ) を使用して RSS フィードのコンテンツを保存する RSS リーダーを開発しています。この配列は、アプリケーション内の 2 つの異なるスレッドによって使用されており、次の理由から、2 つの場合に同時にアクセスされる可能性があります。

  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 ブロックを使用するというアイデアについては考えましたが、どこに正確に配置する必要があるかはよくわかりません ( _stories配列は、コードの多くの場所でアクセスされます)。もう 1 つの質問は、@synchronized ブロックによってスローされる可能性のある例外をどこで処理する必要があるかということです。これにより、多くの冗長なコードが発生する可能性があります。

「非アトミック」なしで @property を使用することについても考えましたが、この問題にはあまり適していないと思います。

これを解決する方法はありますか?前もって感謝します。

4

2 に答える 2

3

私はこれを見つけたばかりで、あなたがまだ答えを探しているとは思えませんが、おそらくこれは他の誰かに役立つでしょう:)

簡単に見てみると、これを解決する方法は次のとおりです。

  • 新しい解析をバックグラウンド スレッドで実行し、これを別の配列にロードします。
  • 新しい配列が読み込まれ、すべてのデータが揃ったら、新しい配列を _stories 配列に追加するメソッドをメイン スレッドで実行し、UI に更新を指示します。

これで _stories 配列を安全に更新して表示できました。配列への同時アクセスのリスクはありません。

于 2010-04-26T22:55:48.113 に答える
0

その他の投稿をモーダルにして、アクティビティ インジケーターを表示してみませんか? 結局のところ、ユーザーが「より多くの投稿」を選択した場合、彼女はある程度の読み込み時間を喜んで受け入れます。

于 2009-11-09T19:56:40.923 に答える