iOS8冻结[GAIDataStore保存]

时间:2014-10-24 12:42:24

标签: ios objective-c core-data google-analytics ios8

我一直在追踪我的项目中的一个错误,该错误导致应用程序冻结,迫使用户重新启动。

只有在发布版本中才有可能,所以追踪是很棘手的。这是一个社交应用,用户将照片上传到他们的个人资料。问题仅在首次下载后或重置隐私设置后首次运行时发生,然后通过流程发布照片。在帖子期间,要求用户访问照片以及访问他们的位置。

在位置服务请求中选择“允许”后,应用程序无响应。

所以我的初步调查是围绕CLLocationManager的使用,我怀疑委托回调有问题。

我无法使用调试配置重现,但可以在设备上运行发布配置,当应用程序无响应时暂停调试器,callstack指向Google Analytics库。

0   0x37a9fb38 in __psynch_cvwait ()<br>
1   0x37b1c3f8 in _pthread_cond_wait ()<br>
2   0x37b1d2dc in pthread_cond_wait ()<br>
3   0x2aa3b482 in -[__NSOperationInternal _waitUntilFinished:] ()<br>
4   0x29c5799e in _CFXNotificationPost ()<br>
5   0x2a9879b8 in -NSNotificationCenter postNotificationName:object:userInfo: ()<br>
6   0x29a87b96 in -NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges ()<br>
7   0x29a6e12e in -[NSManagedObjectContext save:] ()<br>
8   0x002d2e82 in __21-[GAIDataStore save:]_block_invoke ()<br>
9   0x002d16b8 in -GAIDataStore performBlockAndWait:withError: ()<br>
10  0x002d2dc2 in -[GAIDataStore save:] ()<br>
11  0x002db62a in -[GAIBatchingDispatcher persist:] ()<br>
12  0x002dc7aa in -[GAIBatchingDispatcher queueDispatch:] ()<br>
13  0x002dc5b0 in -[GAIBatchingDispatcher queueModel:] ()<br>
14  0x2aa5259e in __NSThreadPerformPerform ()<br>
15  0x29d0958e in _CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION_ ()<br>
16  0x29d0899e in __CFRunLoopDoSources0 ()<br>
17  0x29d07004 in __CFRunLoopRun ()<br>
18  0x29c55620 in CFRunLoopRunSpecific ()<br>
19  0x29c55432 in CFRunLoopRunInMode ()<br>
20  0x2a98d42c in -NSRunLoop(NSRunLoop) runMode:beforeDate: ()<br>
21  0x2a9db8ec in -NSRunLoop(NSRunLoop) run ()<br>
22  0x002cf270 in +[GAI threadMain:] ()<br>
23  0x2aa5238a in _NSThreadmain_ ()<br>
24  0x37b1ce92 in _pthread_body ()<br>
25  0x37b1ce06 in _pthread_start ()<br>

此问题仅出现在iOS8中,我正在运行Google Analytics iOS SDK 3.07版。

该应用程序已上线,并且在出现错误之前已经整合了几个月,这是iOS8上线的时候。关于GAI集成问题的几个帖子报告了链接库的问题,但我不认为这是因为它在大多数情况下工作正常。

如果有人看到任何类似问题或有任何建议,这将有所帮助。

谢谢,

1 个答案:

答案 0 :(得分:1)

您正在收听NSManagedObjectContextDidSaveNotification,GAI SDK会发布此通知,而GAI SDK正在使用您的不同的持久性商店协调员,因此,如果GAI SDK发布此通知,那么尝试合并通知,您正在合并两个不同持久存储的更改,这可能会导致问题。

解决方案很简单,在收听NSManagedObjectContextDidSaveNotification时,您只会回复来自您的背景情况的通知 使用

中的object参数
[NSNotificationCenter -addObserver:selector:name:object:]

你只能听背景上下文,那么GAI上下文不会触发上下文合并。