アプリの起動時に残りのデータをサーバーに送信する必要があるため、
applicationDidFinishLaunching
一部のCoreDataエンティティをJSONテキストに変換してサーバーに送信するメソッドを呼び出します。次の理由でアプリがクラッシュすることがあります。
xxxxxxは時間内に起動できませんでした
私の最初の考えは、アプリの起動時にメインスレッドをブロックする何かをしていることですが、NSURLConnectionを使用して非同期でメインスレッドをブロックしてはならないデータを送信しているため、これは問題ではない可能性があることに気付きました。いくつかのテストの結果、データが大きいとアプリがクラッシュしやすくなることがわかりました。接続が非同期であるため、疑わしいコードはCore DataエンティティからJSONテキストを作成したときだけで、NSLogを使用して印刷します。ハードコードされた大きなjsonファイルを使用しようとすると、常にクラッシュします。NSLog行をコメントアウトしても、クラッシュしません。
シナリオに基づいて、私は疑問に思います:
- NSLogは、どのスレッドで呼び出されているかに関係なく、メインスレッドで実行されているのでしょうか。それから私はAppleのドキュメントで見つけました:
NSLogvからの出力はシリアル化され、プロセス内の1つのスレッドのみが一度に上記の書き込み/ロギングを実行できます。次のスレッドが試行を開始する前に、メッセージの書き込み/ログ記録のすべての試行が完了します。
それは非メインスレッドにあることを意味しますが、それはメインスレッドがブロックされることにつながるいくつかの長い文字列をログに記録していますか?
- NSLogの文字列サイズに(理論的、実用的な)制限はありますか?ハードコードされたJSONファイルは150KBです。
どうもありがとう!