草庐IT

iOS8 在 [GAIDataStore 保存] 中卡住

coder 2024-01-12 原文

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

只有在发布版本中才有可能,因此很难追踪。这是一个社交应用程序,用户可以将照片上传到他们的个人资料中。该问题仅在初始下载后或重置隐私设置后首次运行时出现,然后通过流程发布照片。在发布过程中,用户被要求获得访问照片的权限,以及访问他们的位置的权限。

在定位服务请求上选择“允许”后,应用程序变得无响应。

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

我无法使用调试配置重现,但可以在设备上运行发布配置,当应用程序变得无响应时暂停调试器,调用堆栈指向 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 已经集成了几个月。有几篇关于 GAI 集成问题的帖子报告了链接库的问题,但我认为情况并非如此,因为它在大多数时间都运行良好。

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

谢谢,

最佳答案

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

解决方案很简单,当监听 NSManagedObjectContextDidSaveNotification 时,您只响应来自后台上下文的通知。
通过在

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

只能监听后台上下文,GAI上下文不会触发上下文合并。

关于iOS8 在 [GAIDataStore 保存] 中卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548112/

有关iOS8 在 [GAIDataStore 保存] 中卡住的更多相关文章

  1. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby-on-rails - Rails 3.2 防止使用错误保存对象 - 2

    我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中

  8. ruby-on-rails - 将保存回调添加到单个 ActiveRecord 实例,可以吗? - 2

    是否可以为单个ActiveRecord实例添加回调?作为进一步的限制,这是继续使用库,所以我无法控制该类(除了对其进行猴子修补)。这或多或少是我想做的:defdo_something_creazymessage=Message.newmessage.on_save_call:do_even_more_crazy_stuffenddefdo_even_more_crazy_stuff(message)puts"Message#{message}hasbeensaved!Hallelujah!"end 最佳答案 你可以通过在创建对象后立

  9. ruby - 正则表达式 - 保存重复捕获的组 - 2

    这就是我做的a="%span.rockets#diamonds.ribbons.forever"a=a.match(/(^\%\w+)([\.|\#]\w+)+/)putsa.inspect这是我得到的#这就是我想要的#帮助?我尝试过但失败了:( 最佳答案 通常,您不能获得任意数量的捕获组,但如果您使用扫描,您可以为您想要捕获的每个标记获得一个匹配:a="%span.rockets#diamonds.ribbons.forever"a=a.scan(/^%\w+|\G[.|#]\w+/)putsa.inspect["%span","

  10. ruby-on-rails - ActiveRecord:除非另有说明,否则在保存之前使所有文本字段都调用 strip - 2

    多年来,我在各种网站上遇到过各种问题,用户在字符串和文本字段的开头/结尾放置空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来不对,但实际上并非如此),有时它们实际上会使应用程序崩溃。我认为这会很有用,而不是像我过去所做的那样放入一堆before_save回调,向ActiveRecord添加一些功能以在保存之前自动调用任何字符串/文本字段上的.strip,除非我告诉它不是,例如do_not_strip:field_x,:field_y或类定义顶部的类似内容。在我去弄清楚如何做到这一点之前,有没有人看到更好的解决方案?明确一点,我已经知道我可以做到这一点:befor

随机推荐