2012-03-01 55 views
1

我正在用JSONTouch執行JSON反序列化,但是它耗時太長,它阻塞了UI,所以我試圖讓一個GCD背景隊列將序列化放到後臺線程中。有時它運行良好,但有時我會在deserializeAsDictionary:weakSelf.mutableData error:&theError];上獲得EXC_BAD_ACCESS。在connectionDidFinishLoading中使用Grand Central Dispatch解析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

的問題是,我用一個mutableData對象來存儲三個請求的響應,當一個連接完成,connectionDidFinishLoading:處理程序讀取數據時,在另一個線程另一個連接是數據附加到它。

我爲每個請求創建了一個單獨的NSMutableData對象,並將代碼添加到connectionDidFinishLoading:,以便它從正確的NSMutableData對象讀取。

現在,我的應用程序非常靈敏,處理程序在另一個GCD隊列中運行!

相關問題