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

pthreads - 我可以在 pthread 创建的 threadFunction 中使用 CFRunloop 机制吗?

由于某种原因,我不能使用 NSThread。但我认为在 2 个线程之间使用 CFRunloopSource 的通信方式很方便。所以我想知道是否可以在pthread创建的线程上下文中获取当前的cfrunloop ref?

我上网查了一下,确实看到了一些评论,即使使用 pthread,runloop ref 仍然可用。但我没有从文档中看到任何关于此的内容。所以想请教一下这里有相关经验的人。

此外,我可以通过新线程和当前线程之间的 CFRetain(CFRunLoopGetCurrent()) 共享从新线程检索到的 CFRunloopRef 吗?因为当我想通过 CFRunLoopWakeUp(ref) 在新创建的线程中触发 runloop 时需要 ref

谢谢,

杰克塞拉夫

0 投票
1 回答
802 浏览

objective-c - NSURLConnection 搞乱了 iPad 内存

我们构建了一个 iPad 应用程序,它从 Web 服务下载大量数据和 PDF 文档(首先是数据,然后是后台的文档)。为此,我们通过 HTTP(S) 请求使用 SOAP。它运行良好,总体而言,该应用程序运行良好。问题是,如果在某个时候要下载的文档太多,应用程序就会崩溃。使用 Instruments 我发现这是一个内存问题,尤其是 NSRegularExpression 和 NSRunLoop。(我正在使用 ARC)

我可以改进我的代码来优化 NSRegularExpression 创建。但我不知道如何改进 NSRunLoop 问题。

我尝试了异步和同步 HTTP 请求。使用异步,我不得不等待下载完成,因为 sleep()/[NSThread sleepForTimeInterval:] 不是一个选项,我使用

Instruments 使用同步请求显示

在 NSRunLoop 的帮助下也“等待”并且还会弄乱内存。

这是 CoreFoundation 或 ARC 中的错误吗?

在等待请求完成时是否有另一种空闲方式?

提前致谢。

编辑:

“内存问题”是指应用程序崩溃(或被 iOS 杀死),因为它使用了太多内存。

这是 Instruments 显示的: 仪器截图 应用下载的时间越长,百分比越高。

编辑:

再往下看,发现是 NSURLConnection 搞砸了内存。似乎我以某种方式错过了设置connectionreceivedData设置nil(请参阅URL 加载系统编程指南)。这再次提高了我的内存使用率。

现在,还有两个更大的内存分配操作: 在此处输入图像描述

这是我认为属于 Instruments 显示的代码:

有什么我可以改变来改进代码的吗?

编辑:(从“NSRunLoop 弄乱 iPad 内存”更改标题)

编辑: 我创建了一个测试应用程序来证明它是 NSURLConnection,它弄乱了内存。然后我联系了苹果开发者支持。

由于我在使用 NSURLConnection 的迭代中下载了大量 PDF,因此解决方案是@autoreleasepool { .. }在迭代中添加一个,在NSRunLoop.

谢谢。

0 投票
1 回答
1707 浏览

ios - 在主线程上调用 -[NSRunLoop runMode:beforeDate:] 会导致排队的 NSOperations 在主线程上运行

我今天遇到了一个问题,我的应用程序无法及时启动。事实证明,我使用的一些第三方代码正在尝试使用以下技巧获取用户代理字符串:

(来自http://blog.sallarp.com/iphone-ipad-get-user-agent-for-uiwebview/#more-1003

在调用该代码之前,我通过将一些操作添加到由 +[NSOperationQueue mainQueue] 返回的队列中来排队。这些操作旨在在调用 +[NSData dataWithContentsOfURL:] 时在后台执行。

一旦调用了运行循环上的方法,它就会执行我的排队操作,阻塞主线程并阻止应用程序启动。现在我已经得到了一个解决方法,确保在第三方代码执行之前不要排队任何操作,但是如果有人知道为什么会发生这种情况,以及将来如何防止它,我很想听听. 谢谢!

0 投票
1 回答
310 浏览

input - 为什么应用程序的主运行循环和输入处理不消耗 CPU 时间?

我试图更好地理解运行循环,因为它们适用于 Mac 应用程序(NSRunLoop),但这也可能是一个更普遍的问题。NSRunLoop 文档说:

...您的代码提供了驱动运行循环的whileorfor循环。在您的循环中,您使用运行循环对象来“运行”接收事件并调用已安装处理程序的事件处理代码。

文档有一个这样的代码示例:

所以代码一直调用运行循环,直到它决定它应该终止。方法“-runMode:beforeDate:运行一次循环,在指定的模式下阻塞输入,直到给定的日期。” 还有一种-run方法,“将接收器置于一个永久循环中,在此期间它处理来自所有附加输入源的数据”。

重复调用运行循环(或调用-run,听起来像,这本身)怎么可能不消耗 CPU?Cocoa 应用程序可以在其主运行循环运行时闲置在后台,它将消耗零(或接近零)的 CPU 时间。

在内部-runMode:beforeDate:,运行循环如何在没有轮询和消耗 CPU 的情况下阻塞直到接收到输入或计时器触发?

0 投票
4 回答
6224 浏览

ios - 如何在ios中获得准确的计时器

我正在做一个需要计时器的应用程序。我尝试过NSTimer,但NSTimer总是失败或延迟。iOS SDK中是否有一个可以准确记录时间的类。20ms 到 40ms 之间的精度是可以的。我希望能够在固定的时间间隔内更改图像。

0 投票
1 回答
1726 浏览

iphone - iOS:使用同一个视图的多个 NSTimer 实例 - 我需要使用多线程吗?

我正在开发一个多视图应用程序。其中一个视图是表格视图。每个单元格都有一个秒表。我打算将 NSTimer 用于秒表。即使用户切换视图然后稍后返回,我是否需要实现多线程以使计时器正常工作?我做了我的研究,但大多数教程都在一个视图中涵盖了一个 NSTimer。我想确保用户可以在计时器运行时执行其他操作,例如使用界面、导航等。在另一篇文章将 NSTimer 放置在单独的线程中有人说您需要为计时器使用不同的运行循环。在我的情况下,每个计时器都需要一个运行循环吗?可取吗?任何性能缺点?

非常感谢!

0 投票
1 回答
3024 浏览

iphone - 函数 sleep() 和 [[NSRunLoop currentRunLoop] runUntilDate] 用法的区别

请考虑以下代码:

在第一个中,我调用了一个创建动画的函数。我以一定的时间间隔这样做:

在第二个中,我创建了一个动画

第三个是委托方法,我用它来检查一切是否正常:

所以当我使用NSRunLoop它时,委托方法会被调用,但是如果我尝试使用sleep(3)函数,那么委托方法不会被调用。

我的问题:

1) 你能解释一下 NSRunLoop 和 sleep() 之间的区别吗?为什么使用 sleep() 时不调用委托方法?

2)也许有第三种可能的方法更好用?

0 投票
1 回答
7943 浏览

iphone - 如何使 NSRunLoop 在单独的线程中工作?

请看这段代码:

function方法被调用,但没有 20 秒的暂停。我应该怎么做才能NSRunLoop在分离的线程中工作?

0 投票
2 回答
605 浏览

objective-c - NSRunLoop 在模拟器上运行正常,导致 iDevice 崩溃

我正在开发一个需要逐秒更新的 iOS 应用程序(FW:5.0+ 和 ARC)。

目前,我在一个方法中有这个(当 -ViewDidLoad 时在 performSelector 中调用它):

counter变量在标头中称为 NSTimer。我明确调用[counter fire],所以视图一加载就调用它,而不是 1 秒后调用。

在 iOS 模拟器中运行良好,并且每秒都会触发一次,但是当它进入 iDevice 时,它​​会崩溃。

我已经注释掉了这NSRunLoop条线,并且 iDevice 没有崩溃。但是,它不再每秒更新一次。

我在这里做错了什么?

0 投票
6 回答
20983 浏览

ios - NSTimer 要求我将其添加到 runloop

我想知道是否有人可以解释为什么调度回主队列并创建一个重复NSTimer我必须将它添加到 RUN LOOP 因为它太火了?即使在使用时,performselectorOnMainThread我仍然必须将其添加到 RUN LOOP 以使其触发。

下面是我的问题的一个例子:

编辑: 我相信我对这个问题的措辞很糟糕。如果我打电话,我想知道为什么 [[NSRunLoop currentRunLoop] addTimer:_busTimer forMode:NSRunLoopCommonModes];有必要。如果我不包括该行,则计时器不会触发。startTimersomeMethodBeginCalled

例如,如果我打电话startTimer,我可以删除线路,计时器将每 60 秒触发一次。viewDidLoadNSRunLoop