2013-03-19 8 views
8

私のiOSアプリケーションでは、バックグラウンドスレッド(performSelectorInBackgroundを使用)でいくつかの作業をしています。このスレッドでは、私は、JSON文字列を解析するためにNSJSONSerialization、そのクラスのメソッドを使用しています:クラスメソッドとスレッドの安全性(NSJSONSerialization)

self.json = [NSJSONSerialization JSONObjectWithData:self.data options:0 error:nil]; 

は、このクラスのメソッド(JSONObjectWithData)はスレッドセーフですか?私はこれについて確かめることができますか?ドキュメントにはどこに書かれていますか?

私が知っているインスタンスメソッドは一般にスレッドセーフではありませんドキュメントがそうでない限り、特に指定しない限り、クラスメソッドはスレッドセーフであると一般に言えますか?

+0

最良の方法は、[NSJSONSerialization JSONObjectWithData]上で並列操作をすることです:私が得た応答がNSJSONSerializationは、スレッドセーフであるということでした。もし誰もあなたにそれがスレッドセーフであると言わなければ、それはスレッドセーフではありません;) –

+0

残念ながら、スレッド安全性を記述している文書はNSSSONSerializationを表示するように更新されていません。 http://developer.apple.com/library/ios/#Documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html –

+0

self.jsonを使用したい場合は、スレッドセーフにしてから動作させますか? – Exploring

答えて

-1

管理コンテンツはスレッドセーフではありません。メインスレッドでコードを実行するか、バックグラウンドで実行し、NSNotificationCenterを使用してバックグラウンドスレッドの処理が完了したらUIのリロードを開始できます。

+2

質問は(私が理解しているように)バックグラウンドスレッドからUIを変更するのではなく、複数のスレッドから '[NSJSONSerialization JSONObjectWithData:...]'を同時に呼び出すことが安全かどうかということでした。 –

1

私はここで少し推測しています。

Threading Programming Guide状態

不変オブジェクトは、一般に、スレッドセーフです。一度作成すると、 はこれらのオブジェクトをスレッド間で安全に渡すことができます。

クラスメソッドを呼び出すことは、クラスオブジェクトにメッセージを送信することを意味し、クラスオブジェクトは不変です。私の結論は、異なるtheadsからクラスメソッドを呼び出すことは安全であるということでしょう。

+1

クラスメソッドにグローバル状態が関係していない限り、これは判別が難しい場合があります。 –