2012-03-01 14 views
1

私はJSONTouchとJSONの直列化復元を行っておりますよ、それは時間がかかりすぎだし、それがUIをブロックしていますので、私は、バックグラウンドスレッドでシリアライズを置くためにGCDの背景キューを作成しようとしました。時にはそれは細かい動作しますが、時々私はdeserializeAsDictionary:weakSelf.mutableData error:&theError];にEXC_BAD_ACCESSを取得します。解析JSON :?

私は理由として途方に暮れてよ。私は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); 
} 

答えて

1

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

Iは、すべての要求に対して個別のNSMutableDataオブジェクトを作成し、それが正しいNSMutableDataオブジェクトから読み取るようconnectionDidFinishLoading:にコードを追加しました。

私のアプリケーションは、ハンドラは、別のGCDキューで実行されていることを今非常に敏感です!