1

JSONTouch で JSON デシリアライゼーションを実行していますが、時間がかかりすぎて UI をブロックしているため、シリアライゼーションをバックグラウンド スレッドに入れるために GCD バックグラウンド キューを作成しようとしました。正常に動作する場合もありますが、場合によっては EXC_BAD_ACCESS が発生しdeserializeAsDictionary:weakSelf.mutableData error:&theError];ます。

なぜだか途方に暮れています。mutableData をアトミック プロパティにしました。一度に 3 つのリクエストを作成しているので、mutableData にアクセスしようとしているスレッドと関係があると思いますか? または、ブロックの実行時に mutableData が適切な状態にない可能性がありますか?

どうもありがとう!

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
     __weak myViewController *weakSelf = self;

    dispatch_queue_t updateQueue = dispatch_queue_create("parse json", NULL);
    dispatch_async(updateQueue, ^{
        NSError *theError = nil;

    // This is the call that gives me EXC_BAD_ACCESS
    NSDictionary *dict = [[CJSONDeserializer deserializer] 
       deserializeAsDictionary:weakSelf.mutableData error:&theError];

   dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf setMutableData: nil];
      });
   });
   dispatch_release(updateQueue);
}
4

1 に答える 1

1

問題はmutableData、3 つの要求の応答を格納するために 1 つのオブジェクトを使用していたことです。1 つの接続が終了し、connectionDidFinishLoading:ハンドラーがデータを読み取っているときに、別のスレッドの別の接続がそれにデータを追加していました。

リクエストごとに個別の NSMutableData オブジェクトを作成しconnectionDidFinishLoading:、正しい NSMutableData オブジェクトから読み取るようにコードを追加しました。

ハンドラーが別の GCD キューで実行されているため、アプリケーションの応答性が非常に高くなりました。

于 2012-03-05T08:09:02.380 に答える