2

私は持っている:

1) 2 つの非同期 NSUrlRequestを同時に開始する

2) 2 つの要求のいずれかが XML データをロードするとすぐに、NSOperationQueue を使用して XML パーサーを開始します。これにより、ParseOperations は Apple の LazyTableImages の例のように正確に機能します。

InfoRequestHelper.m

// ...

case GetBlogEntries:
{
    BlogParseOperation *parser = [[BlogParseOperation alloc] initWithXMLString:result delegate:self];
    parser.tag = helper.requestTag;

    [queue addOperation:parser]; // this will start the "ParseOperation"

    [parser release];

    break;
}
case GetTweets:
{
    TwitterParseOperation *parser = [[TwitterParseOperation alloc] initWithXMLString:result delegate:self];
    parser.tag = helper.requestTag;

    [queue addOperation:parser]; // this will start the "ParseOperation"

    [parser release];

    break;
}

// ...

3) 解析が終了すると parser:didFinishParsing: が発火します。

InfoRequestHelper.m

- (void)parser:(ParseOperationBase *)parser didFinishParsing:(NSArray *)entries
{
    // Save data, remove completed request from list
    [self.requestsInProgress removeObjectForKey:parser.tag];
    [self.resultObjects addObjectsFromArray:entries];  // <= !!! EXC_BAD_ACCESS !!! here

    // ..    
}

問題: 最初のイベントがここに到着すると、オブジェクトを配列に追加できます。しかし、2 番目が到着すると、EXC_BAD_ACCESS があります。

4

2 に答える 2

1

resultObjects編集:両方の解析方法で変数にアクセスしようとしていると思います。そして、resultObjects は mutableArray です。したがって、問題は、ある関数から変数にオブジェクトを追加または削除しようとしているときに、別の関数もそれにアクセスしようとしていることです。それはあなたにエラーを与えるでしょう。マルチスレッドアプリを作成するときにもそれを学びました。

スレッドの安全でないクラスに関するアップルのドキュメントを参照してください。これを回避する最善の方法は、代わりに NSArray オブジェクトを使用することです。

また、変数にオブジェクトを追加または削除する場合は、最初に内容を変更可能な配列に入れ、それを操作してから、元のオブジェクトに割り当てます。

これが理にかなっていることを願っています。そのようなエラーを見つけるのがどれほど難しいかを私は知っています。

于 2011-02-09T08:23:03.450 に答える
0

データの入力に同じ配列を使用している場合は、基本的なスレッド化の概念が欠けていると思います。 複数のスレッドから書き込みモードで変数にアクセスしてはなりません。

最初にアレイのロックを取得してから続行する必要があります。

于 2011-02-09T12:54:24.923 に答える