0

ジグソーパズルアプリを作っています。パズルの進行状況を保存するためにコア データを使用する予定でしたが、プロパティ リスト ファイルを使用するように切り替えました。しかし今、私は問題に直面しています。

アプリを起動すると、パズルのピースを最初から作成することも、plist ファイルの情報に基づいて作成することもできます。それらをゼロから作成すると、処理中のアニメーションについてかなり正確なアクティビティ インジケーターを表示できます。

ただし、プロパティ リスト データから再構築する場合、すべての処理が完了した後も、初期表示を遅らせる何らかのアクティビティが引き続き発生します。インストルメントと NSLog ステートメントを使用しても、遅延の原因を特定することはできませんでした。

しかし、たった今、NSLog ステートメントが処理が完了したことを示した後、表示が完了する前にアプリを一時停止することにしました。ランダムなスレッドをたどっていくと、私の見解が突然現れました。

そのスレッド (スレッド 24) には、その下に CFPreferences Background Sync Queue という説明がありました。ビューが表示されたときの画面上のブロックは次のとおりです。

libdispatch.dylib`_dispatch_call_block_and_release:
0x3c6fa114:  push   {r4, r7, lr}
0x3c6fa116:  mov    r4, r0
0x3c6fa118:  add    r7, sp, #4
0x3c6fa11a:  ldr    r1, [r4, #12]
0x3c6fa11c:  blx    r1
0x3c6fa11e:  mov    r0, r4
0x3c6fa120:  pop.w  {r4, r7, lr}
0x3c6fa124:  b.w    0x3c7127dc                ; _Block_release$shim

ここでは NSUserDefaults を使用していませんが、別のプロパティ リストを使用していることに注意してください。私はそれらを次のように使用します:

NSError *error;
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *plistPath = [rootPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",self.leftImage.imageName]];
NSData *plistData = [NSData dataWithContentsOfFile:plistPath];
BOOL returnValue = YES;
if(plistData) {
    NSPropertyListFormat format;
    NSDictionary* plist = [NSPropertyListSerialization propertyListWithData:plistData options:NSPropertyListImmutable format:&format error:&error];

    if (plist) { .. etc.

ここでは、plist のデータを使用して、dispatch_async を使用して必要なオブジェクトを作成します。ディスクから取得したリストを更新していないので、何を同期する必要があるのか​​ わかりませんが、遅延の原因となっているプロセスはプロパティリストの同期に関連しているようです(名前に基づいた私の勘です)見てます)。

この問題を解決する方法についてのヒントをいただければ幸いです。

PS-(void)didMoveToWindowすべてのUIViewサブクラスに追加し、トリガーされたときにself.windowをチェックしました。これは、ビューがウィンドウに表示されているかどうかを確認するために使用できると思われます。すべての場合において、self.window には値があり、didMoveToWindow私が投稿している遅延の前にメソッドが呼び出されます。autolayout がいろいろなことをしている可能性が低いので、オフにしてみましたが、違いはありませんでした。また、データの処理が終了したらすぐに、各辞書と plist 変数を nil に設定するようにしましたが、それでも違いはありませんでした。ご覧のとおり、私は今、ストローをつかんでいます。

PPS 参考までに、遅延中に呼び出されるメソッドのリストを次に示します。各メソッドの前の数字は、遅延期間中に呼び出された回数です。各非同期ブロックの最後でGENERICMARKFORASYNC_ _ _ _ENDOFMARKという空のメソッドを呼び出して、遅延期間の開始を特定しました。メイン コードにも同様のマークがありましたが、当然のことながら、非同期コードは最後に終了しました。ビューが最終的に表示された後にビューを移動し、ログで認識されているパン ジェスチャを探して、遅延の終わりを特定しました。

4

0 に答える 0