我一直在制作一个拼图游戏应用程序。我原本打算使用核心数据来保存拼图的进度,但我转而使用属性列表文件,我认为这些文件工作得更好。但现在我遇到了一个问题。
启动应用程序,它可以从头开始创建拼图,也可以根据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创建我需要的对象。我没有更新从磁盘检索到的任何列表,所以我不确定需要同步的是什么,但似乎导致延迟的进程与属性列表同步有关(根据名称我只是预感)我看到了。
非常感谢有关如何解决此问题的任何提示。
P.S。我将-(void)didMoveToWindow
添加到我的所有UIView子类中,当触发时,我检查了self.window。这可以用来检查视图是否出现在窗口中。在所有情况下,self.window都有一个值,didMoveToWindow
方法在我发布的延迟之前被调用。关于autolayout正在做一堆东西的可能性,我尝试将其关闭,但这并没有什么不同。我还确保在完成数据后立即将每个字典和plist变量设置为nil,这也没有任何区别。如你所见,我现在正在抓稻草。
P.P.S。如果它有用,这里是listing of methods called during the delay。每种方法前面的数字是在延迟期间调用它的次数。我通过在每个异步块的末尾调用名为GENERICMARKFORASYNC_ _ __ _ENDOFMARK的空方法来确定延迟期的开始。我对主代码有类似的标记,但不出所料,异步代码最后完成了。我通过在最终出现之后移动视图并查找在日志中识别的平移手势来确定延迟的结束。