问题标签 [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 投票
2 回答
1895 浏览

ios - iOS UIScrollView 被 NSRunLoopCommonModes 卡住且无响应

在我的 iPhone 应用程序中,我使用 3rd 方库 (libPusher) 进行 WebSockets 网络,并且该库导致我的应用程序中的每个 UIScrollView 组件都变得无响应。这包括 UIScrollViews 和 UITableView。

发生的情况是,如果用户用手指滚动其中一个 UIScrollView 组件,并且碰巧在网络操作正在进行的同时用手指继续触摸和滑动视图,那么这会导致 UIScrollView 完全无响应并停止接受触摸事件(即使手指抬起,它也认为它一直处于拖动模式)并且没有适当地减速。唯一的出路是销毁 UIScrollView 并重新创建一个新的。

我已经联系了图书馆的开发人员,但不幸的是到目前为止还没有收到回复。

根据我的阅读,这是在不适当的模式下运行运行循环时的常见问题,例如NSDefaultRunLoopMode,但是这个库似乎在做正确的事情并且它运行它的运行循环NSRunLoopCommonModes所以我不清楚正确的解决方案是。

我尝试使用不同的模式(尝试过NSDefaultRunLoopMode),但行为是相同的。

我正在使用 iOS 5,它在模拟器和设备上的行为相同。

让我将我认为有问题的代码粘贴到库中,希望这足以让您帮助我找到解决方案。

在 NSOperation 的子类中,我们有:

此操作在线程上运行,如[[NSOperationQueue mainQueue] addOperation:authOperation];. (也许这就是问题所在,但我尝试在另一个线程中运行它并且它崩溃了,所以库需要更多的工作才能使其后台线程安全,所以我还不能证明这是解决方案......)

到目前为止我试过

  • 将运行循环模式更改为NSDefaultRunLoopMode- 没有帮助。
  • 在我创建的新操作队列中运行操作(例如,不在主线程上),但库似乎还没有准备好,因为它崩溃了。

我仍然觉得我在黑暗中射击......帮助:)

谢谢!

0 投票
4 回答
1838 浏览

iphone - 停止在后台线程中执行动画并运行循环

我在 UITTableViewCell 中运行我的动画。每个单元格都有自己的动画,并且单元格是可重复使用的。我用[mView performSelectorInBackground:@selector(layoutSubview) withObject:nil];

在后台线程中,我启动 runLoop 以执行如下任务:

并停止它:

当我快速滚动表格时遇到问题,因为在第一个单元格启动时我开始动画,所以第一个 runLoop 调用发生,它执行 setNeedDisplay 和它的所有方法。但是在完成第一个 runLoop 循环之前,单元格从视图中消失并且已经可以重用了。所以我开始清除它,而循环仍在执行操作,在这里我遇到了这样的情况

发送到已释放实例的消息

那么您能否给我一些提示,说明我应该如何正确停止在该线程中执行操作?我的意思是,如果我想了解例如一个正在执行某些操作的对象,如何立即停止它们?

希望我提供了足够的信息。谢谢

更新:完全没有想法?

0 投票
1 回答
8735 浏览

macos - CFRunLoopRun() 与 [NSRunLoop 运行]

我有一个 NSRunLoop 对象,我将计时器和流附加到该对象。它工作得很好。停止它是另一个故事。

我使用[runLoop run].

如果我尝试使用 停止循环CRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]),则循环不会停止。如果我改为使用开始循环CRunLoopRun(),它会起作用。我还确保调用是在正确的线程(运行我的自定义运行循环的线程)上进行的。我已经用pthread_self().

CRunLoopStop()我找到了一个邮件列表存档,其中一位开发人员说“如果您使用 run 方法启动循环,请不要打扰使用NSRunLoop”。我可以理解为什么会这样——你通常将初始化器和终结器从同一组函数中配对。

你如何阻止一个NSRunLoop没有“诉诸CF”的人?我没有stopNSRunLoop. 文档说您可以通过三种方式停止运行循环:

  1. 配置运行循环以使用超时值运行
  2. 告诉运行循环停止使用CFRunLoopStop()
  3. 移除所有输入源,但这是停止运行循环的一种不可靠的方法,因为你永远无法知道是什么东西卡在了你背后的运行循环中

好吧,我已经尝试了 2。它有一种“丑陋”的感觉,因为你必须深入研究 CF。3. 不可能——我不喜欢非确定性代码。

这给我们留下了 1。如果我正确理解了这些文档,您就不能将超时“添加”到已经存在的运行循环中。您只能在超时的情况下运行新的运行循环。如果我运行一个新的运行循环,它不会解决我的问题,因为它只会创建一个嵌套的运行循环。我还是会回到旧的,我想停下来……对吧?我可能误解了这一点。另外,我不想使用超时值运行循环。如果我这样做了,我将不得不在消耗 CPU 周期(低超时值)和响应能力(高超时值)之间进行权衡。

这是我现在的设置(伪代码):

通讯器.h

Communicator.m

我是什么做的?弄乱 CF 是常见的/好的模式吗?我对基金会不够了解。干扰 CF 层是否可能是危险的(关于内存损坏、不一致、内存泄漏)?是否有更好的模式来实现我想要实现的目标?

0 投票
1 回答
793 浏览

iphone - 使用 NSRunLoop

我在 viewDidLoad 中运行 2 个方法,在它们之间运行 NSRunLoop 10 秒

这里图像没有改变,黑屏,10 秒后我只看到 [恐怖] 的结果。另一方面,当我在 viewDidLoad 中只保留 [nextImage] 图像更改时,我认为我的 NSRunLoop 出了点问题

0 投票
1 回答
519 浏览

iphone - NSRunLoop 和 NSAutoreleasePool,它们是如何交互的?

自动释放池将在运行循环结束时释放。

这是否意味着任何循环迭代的结束?这什么时候发生?

在处理完每个触摸、动作或远程控制事件后,池将被清空。

如果我们的应用程序不提供任何触摸怎么办?

如果我们使用这样的代码,我们如何确定对象在 [self someObject]retain之间没有被释放someMethod

0 投票
1 回答
3738 浏览

ios5 - RunLoop 中的 CADisplayLink 未调用回调

我有以下代码应该使每一帧都调用drawFrame,但它没有:

displayLink 是指向 CADisplayLink 的指针。在我看来,它们连接到一个标签。此视图连接到 viewReference。self 是 ViewController。声明了drawFrame

当我在 viewDidLoad 中测试时,可以设置 thel.text。

似乎 drawFrame 从未被调用过。该应用程序基于带有自定义故事板文件的 Xcode 4.2 空应用程序模板(我后来添加了它,而不是选择在创建时使用故事板)。除了视图控制器、视图和标签之外,它是空的。

我是新手。当调用 [[NSRunLoop currentRunLoop] run] iOS 5.0 Simulator 根本不显示应用程序。currentRunLoop 无论如何都应该是默认的主 runLoop。

0 投票
1 回答
346 浏览

ios - iOS:如果我的应用程序进入非活动状态,待处理的延迟执行选择器请求会发生什么情况?

我的预感是,执行选择器以 afterDelay 值 > 0.0 开始,并且在应用程序进入后台时还有剩余时间不会在后台执行,但会在应用程序退出后台后继续运行,并且它们的时钟会减少模式。

但我的预感正确吗?

0 投票
1 回答
1162 浏览

ios - 我们怎样才能停止线程

我正在开发我的线程在 connectionDidFinishLoading 时启动的应用程序。

connectionDidFinishLoading 被多次调用,所以我想停止下载线程,然后再次启动它。我试图只执行最后一个线程。请帮助我在两者之间停止我的线程。

0 投票
1 回答
841 浏览

cocoa - Cocoa 的事​​件驱动系统:后台任务在哪里运行?

在 Mac OS X 上,Cocoa 是事件驱动的。我的意思是每件事都是由 UI 驱动的——用户单击某物或在某个区域上移动会导致调用事件处理程序。Main 只是调用 NSApplicationMain () 来创建一个无限循环,直到程序退出。

那些不是用户驱动的任务呢?我应该将需要在后台工作以提供程序基本功能的任务放在哪里?例如,当用户与 UI 交互时,Photo Booth 会执行某些操作(即当用户单击某个按钮时更改为摄像机)。但是,Photo Booth 也不断地从相机中检索帧以提供视频流。

所以我的问题是非 UI 任务代码去哪里了?Main() 是不可能的,因为我需要任务在程序的整个生命周期中运行,而不是在程序刚启动时运行。

我在 Mac OS X Snow Leopard 上(我想要一些适用于所有 Mac 系统的东西:即 Lion OS X)并且在 Xcode 中使用 Obj-C Cocoa 应用程序。

0 投票
0 回答
520 浏览

cocoa-touch - `cancelPerformSelectorsWithTarget:` vs `cancelPreviousPerformRequestsWithTarget:`

我正在构建一种模拟,“滴答声”之间的间隔越来越小:

离开模拟屏幕时,我想停止模拟,所以我这样做

我第一次尝试使用

……但这没有用。

为什么不?

显然,还有许多 其他人有同样的问题和相同的解决方案。但我无处可寻。两者有什么区别?