问题标签 [nsrunloop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2516 浏览

objective-c - 在不同的 NSThread/NSRunLoop 中运行和管理 NSTimer

我正在编写一个 Cocoa 应用程序,其 GUI 是在 Interface Builder 中设计的。我需要在不阻塞 UI 的情况下安排后台活动(定期),所以我在单独的线程中运行它,如下所示:

我保留了计时器,因此我可以轻松地使计时器无效并重新安排时间。

问题:我还必须触发 run: 方法以响应 GUI 事件,因此它是同步的(即“执行活动”按钮)。像这样:

我也可以使用 performSelectorInBackground 来做到这一点,当然它不会阻塞 UI。但是这种同步触发在另一个运行循环中运行!所以我不能保证它们不会重叠。如何在同一个运行循环中将所有触发排队?

0 投票
1 回答
3527 浏览

iphone - NSTimer 和更新 UI

我一直在尝试让我的游戏与NSTimer. 我见过很多人和我有类似的问题,我只是需要澄清一些事情。

基本上我NSTimer在主线程上运行,它正在更新代表时间的图像,但我也有一个 mapView。当用户平移地图时,计时器被阻止。我的问题是,如果我创建一个新线程并将计时器添加到其运行循环中,当我执行选择器(更新 UI)时,这不会再次阻塞计时器线程吗?另外我知道从辅助线程更新 UI 是不好的做法,那么我该怎么做呢?

更新:我认为 mapView 正在阻止计时器,因为它们都在同一个运行循环中运行。我现在已经用一个带有自己的运行循环的计时器线程解决了这个问题,但是这导致我遇到了第二个问题,这让我非常卡住!这是代码...

这段代码在 [pool drain] 上给了我一个 Bad_access 错误

我已经在仪器中运行了代码,但仍然看不到它为什么会给我错误。有任何想法吗?

0 投票
1 回答
15056 浏览

iphone - 如何停止计时器触发的运行循环?

如果我像这样设置一个运行循环:

我可以再停下来吗?还是忽略我用来触发进一步操作的通知的唯一方法?

好的,我举一个问题的例子:

}

当然,这里有几个错误——毫无疑问。但我认为,它显示了我的问题。直到现在,答案还不能真正解决。

我需要运行一个计时器并稍后停止它。理想情况下是在类中的另一个函数之外。但是后来我无法再访问“计时器”并且runloop不允许弄清楚,如果这样的“消息”可用。如果我为函数的每次调用注册一个新计时器,那将是非常无效的。

0 投票
1 回答
427 浏览

iphone - Cocoa Run Loop 输入源

我正在编写一个 iPhone 应用程序,我需要在后台下载文件。我可以处理下载文件部分,但我不太确定背景部分。我目前的想法是使用运行循环等到用户选择要下载的文件。这似乎可行,但如果没有设置输入源,则会退出运行循环。但是,Apple 文档对预定义的自定义输入源说了一些话,允许您使用函数
performSelector:onThread:withObject:waitUntilDone:
来运行函数。我想知道如何将该输入源添加到运行循环。

0 投票
4 回答
3685 浏览

objective-c - 如何包装异步类以使其同步?使用 NSRunLoop?

我目前正在开发一个 iPhone 应用程序,并且我有一个来自第三方的库,它具有异步行为,但我想用我自己的类进行包装并使其看起来是同步的。

这个库中的中心类,我们称之为 Connection 类,有几个函数,当调用委托类的实例上的方法时,它们的最终结果会被解析。我想要做的是包装这个类和委托,使它看起来是同步的而不是异步的。如果我在 Java 中执行此操作,我会使用 FutureTask 或 CountdownLatch 或只是 join()。但我不确定在 Objective C 中执行此操作的最佳方法。

我首先创建了一个符合上述委托协议的 NSThread 扩展 NFCThread。这个想法是我将初始化和 NFCThread,将 NFCThread 实例传递给 Connection 的 setDelegate 方法,启动线程,然后在 Connection 上调用异步方法。我的期望是调用 NFCThread 实例上的三个委托方法之一,最终导致线程退出。

为了模拟加入,我做了以下事情。我在 NFCThread 中添加了一个 NSConditionalLock:

调用 Connection 的代码如下所示:

委托的协议具有三种方法。在 NFCThread 中,我实现了每个方法,如下所示:

我重载了 NFCThread 的 main 方法,使它不断循环。像这样的东西:

我发现这并不是一个好主意,因为它会导致 CPU 使用率飙升。因此,我尝试使用我在此站点上找到的一些示例中的运行循环:

在我的两个实现中,主线程总是被阻塞,并且似乎没有调用任何委托方法。但是,我知道该库运行正常,并且通常调用委托方法。

我觉得我在这里遗漏了一些明显的东西。非常感谢任何帮助。

富有的

0 投票
1 回答
313 浏览

iphone - 如何针对 NSConnection 消息确定 performSelectorOnMainThread 的优先级?

我有很多NSURLConnections下载。它们可能不会发生在主线程上。当其中一些完成时,我需要performSelectorOnMainThread一个单独的单例对象。

我使用了两种形式的performSelectorOnMainThread,指定运行循环模式 ( NSDefaultRunLoopMode) 并没有指定它。 NSDefaultRunLoopMode应该避免NSConnection选择器,但消息似乎仍然受到它们的限制。直到所有未决连接都已完全下载后,才会执行指示的选择器。

我如何优先考虑performSelectorOnMainThread在其他人之前发生?

0 投票
1 回答
1450 浏览

objective-c - 使用 NSAutoreleasePool 从线程方法返回后 NSRunLoop 出错

从设置了 NSAutoreleasePool 的线程方法返回后,我收到 EXC_BAD_ACCESS 错误。失败的地方是调用 NSRunLoop。我正在尝试包装一个主要由一个类(我们称其为 Connection 类)及其委托组成的第 3 方库,以便它与客户端类同步而不是异步运行。名为 NFCConnection 的包装类符合委托协议,并在 NFCConnection 的构造函数中传递给 Connection 的 setDelegate 方法。

我创建新线程的方法如下:

线程方法 doSomethingImportant 如下所示:

对 Connection 的 somethingImportant 的调用将导致在主线程上调用委托方法之一。在每个回调方法中,我将变量 callBackMethod 设置为 NO,导致方法 A 中的 while 循环退出。该错误发生在 doSomethingImportant 返回之后但在调用其中一个委托方法之前。EXC_BAD_ACCESS 错误发生在调用 NSRunLoop 时。这是堆栈跟踪的一部分:

现在,如果我忽略在 doSomethingImportant 中设置自动释放池,我可以完全防止错误发生,并且包装的 API 似乎可以同步工作。但是,如果我要这样做,那么控制台中会打印以下内容:

上面的这些消息是由 Connection 类实例中没有释放的东西引起的吗?我正在创建一个 NSDate 但不是需要发布的实例。与 NSTimer 相同。

我试图通过设置 NSAutoreleasePool 来做正确的事情,但看起来我做错了什么。但是,我不知道那可能是什么。非常感谢任何帮助!

富有的

0 投票
1 回答
2398 浏览

iphone - 在iOS上的主线程的runloop与bg线程的runloop中调度异步下载?

这是 WWDC 2010 会议 208 的幻灯片:

将多个 conn 放入 currentRunLoop 是否有任何问题?

在后台线程的运行循环中调度 NSURLConnection 有什么好处?

谢谢!

0 投票
1 回答
2184 浏览

iphone - 多个 NSURLConnection & NSRunLoop

我正在尝试加快我的应用程序下载速度。我使用异步 NSURLConnection 从服务器下载内容,一个连接就可以正常工作。

我使用这篇文章中的代码来实现多个委托对象。Objective-C 中的多个 NSURLConnection 委托

当我创建 2 个 NSURLConnection 对象时,每个对象都在尝试下载不同的文件。回调 didReceiveData 例程被调用,但它只接收第一个 NSURLConnection 对象的数据,直到第一个连接完成,然后它开始从第二个 NSURLConnection 接收数据。我希望这两个连接同时接收数据,我该怎么办?这是我当前的代码。

然后在我的委托对象中,我实现了这些例程

0 投票
2 回答
667 浏览

objective-c - 基础工具 OS X 服务、垃圾收集、MacRuby:为什么我的 NSRunLoop 不会在 acceptInputForMode:beforeDate: 中循环?