0

我有一个应用程序,我从输入流中读取数据并将其可视化为用户。当我设置输入流时,我将它设置在后台运行循环中,打开它并运行后台循环。但有时我的应用程序意外中断。我无法重复这次崩溃,所以我甚至不知道从哪里开始修复它。iOS应用程序意外中断。多线程问题(可能)

崩溃,我得到的是这样的: enter image description here

以及它崩溃的方法是这样的: enter image description here

它说,它是Enqueued from background queue (Thread 3)。而Thread 3看起来像这样: enter image description here

这可能是什么原因?我应该在哪里开始解决它?


而且奇怪的是,在Thread 17,它崩溃可变bg_queue是零,反正它传递的,如果条件在那里我做

如果(bg_queue!=无)

但在线程3它不是零:

螺纹17 enter image description here

线程3 enter image description here

+1

我会尽量确保您不会从错误的线程/上下文访问托管对象。 – Avi

+0

谢谢你的建议,但我不想访问此方法中的任何托管对象。 – hockeyman

回答

2

看来,创建由GCD管理的辅助线程运行循环。您不应该从GCD管理的线程获取运行循环!

创建您自己的专用线程或使用主线程获取运行循环。

+0

那么你会如何建议我在不使用GCD的情况下获得相同的结果,但不会影响应用程序其余部分的性能? – hockeyman

+0

不幸的是,这可能会变成一个更复杂的答案。你有几个选择:1. a)创建一个专用线程或使用主线程,在那里获得运行循环,b)在所需的调度队列上安排实际工作。 2.从CFStream获取本地套接字句柄,并使用分派源以异步方式从它们读取/写入它们。 3.在Dispatch IO中使用纯粹的GCD方法 - 也就是说,不要使用基于运行循环的CFStream并在一个解决方案中调度队列。 4.同步使用CFStream。 – CouchDeveloper

+0

谢谢你的解决方案。我会尝试一下,让我知道我是否成功。 – hockeyman

1

如果你创建第二个runloop,你比我更勇敢。我永远不敢这样做,因为我会确定它会导致难以解决的问题。正如你所发现的。

如果您确定您是一位比我更聪明的开发人员,那么对不起,您自己。如果你不确定,那么不要这样做!远离二次运行循环!

+0

那么您如何让我在不影响UI性能的情况下连续读取和处理来自输入源的数据?因为据我所知,我确实需要运行循环,并且我仅为数据处理创建了一个单独的循环。 – hockeyman