iPhone 3GS 上后台线程消耗 100% CPU 导致潜在主线程

2023-11-21

在我的应用程序中,我在 NSOperationQueue 中执行 10 个异步 NSURLConnections 作为 NSInitationOperations。为了防止每个操作在连接有机会完成之前返回,我调用 CFRunLoopRun() ,如下所示:

- (void)connectInBackground:(NSURLRequest*)URLRequest {
 TTURLConnection* connection = [[TTURLConnection alloc] initWithRequest:URLRequest delegate:self];

 // Prevent the thread from exiting while the asynchronous connection completes the work.  Delegate methods will
 // continue the run loop when the connection is finished.
 CFRunLoopRun();

 [connection release];
}

连接完成后,最终的连接委托选择器调用 CFRunLoopStop(CFRunLoopGetCurrent()) 来恢复 connectInBackground() 中的执行,使其正常返回:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    TTURLConnection* ttConnection = (TTURLConnection*)connection;
    ...
    // Resume execution where CFRunLoopRun() was called.
    CFRunLoopStop(CFRunLoopGetCurrent());
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {  
    TTURLConnection* ttConnection = (TTURLConnection*)connection;
    ...
    // Resume execution where CFRunLoopRun() was called.
 CFRunLoopStop(CFRunLoopGetCurrent());
}

这工作得很好,而且是线程安全的,因为我将每个连接的响应和数据作为实例变量捆绑在 TTURLConnection 子类中。

NSOperationQueue 声称将其最大并发操作数保留为 NSOperationQueueDefaultMaxConcurrentOperationCount 允许它动态调整操作数,但是,在这种情况下,它始终认为 1 就足够了。因为这不是我想要的,所以我将最大数量更改为 10,现在它已经严重拖拉了。

这样做的问题是这些线程(在 SpringBoard 和 DTMobileIS 的帮助下)消耗了所有可用的 CPU 时间并导致主线程变得潜在。换句话说,一旦 CPU 利用率达到 100%,主线程处理 UI 事件的速度就不会达到维持流畅 UI 所需的速度。具体来说,表视图滚动变得不稳定。

Process Name  % CPU
SpringBoard   45.1
MyApp         33.8
DTMobileIS    12.2
...

当用户与屏幕交互或表格滚动时,主线程的优先级变为 1.0(最高可能),并且其运行循环模式变为 UIEventTrackingMode。默认情况下,每个操作的线程的优先级都是 0.5,并且异步连接在 NSDefaultRunLoopMode 中运行。由于我对线程及其运行循环如何根据优先级和模式进行交互的理解有限,我被难住了。

有没有一种方法可以安全地消耗应用程序后台线程中的所有可用 CPU 时间,同时仍然保证为其主线程提供所需的 CPU 时间?也许通过强制主线程根据需要运行? (我认为线程优先级会解决这个问题。)

12/23 更新:我终于开始掌握 CPU 采样器,并找到了 UI 变得不稳定的大部分原因。首先,我的软件正在调用一个具有互斥信号量的库。这些锁会在短时间内阻塞主线程,导致滚动稍微跳过。

此外,我发现一些昂贵的 NSFileManager 调用和 md5 哈希函数需要花费太多时间来运行。过于频繁地分配大对象会导致主线程中出现一些其他性能问题。

我已经开始解决这些问题并且性能已经比以前好很多了。我有 5 个同时连接,并且滚动很流畅,但我还有更多工作要做。我计划编写一份关于如何使用 CPU Sampler 来检测和修复影响主线程性能的问题的指南。感谢迄今为止的评论,它们很有帮助!

2010 年 1 月 14 日更新:在达到可接受的性能后,我开始意识到 CFNetwork 框架偶尔会泄漏内存。 CFNetwork 内部也随机(但是很少)出现异常!我尽了一切努力来避免这些问题,但没有任何效果。我非常确定这些问题是由于 NSURLConnection 本身的缺陷造成的。我编写的测试程序除了练习 NSURLConnection 之外什么也没做,但它们仍然崩溃和泄漏。

最终我将 NSURLConnection 替换为ASIHTTP请求撞击声完全停止了。 CF网络almost永远不会泄漏,但是,在解析 DNS 名称时仍然会发生一种非常罕见的泄漏。我现在已经很满意了。希望这些信息可以为您节省一些时间!


实际上,您根本无法拥有超过两个或三个后台网络线程并且让 UI 保持完全响应。

针对用户响应进行优化,这是用户真正注意到的唯一事情。或者(我真的很讨厌这么说)在您的应用程序中添加一个“Turbo”按钮,该按钮会弹出一个非交互式模式对话框,并将并发操作数增加到 10 个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone 3GS 上后台线程消耗 100% CPU 导致潜在主线程 的相关文章

  • 编码时捕获 NS_AVAILABLE_IOS

    我知道如何更改支持的最低操作系统IPHONEOS DEPLOYMENT TARGET 我目前正在 Xcode 4 5 下进行开发并使用 iOS 6 0 SDK 我想做的是找到一种方法 每当我使用标记的代码时在编译中抛出警告 NS AVAIL
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S
  • 隐藏选项卡栏项目并对齐其他选项卡项目

    在我的应用程序中 我有 4 个选项卡栏项目 我正在 XIB 文件中添加这 4 个选项卡栏项目 最初我必须显示 3 个选项卡栏项目 同步后我必须在我的应用程序中显示第 4 个选项卡栏项目 因此 为此 我使用以下代码隐藏第四个选项卡栏项目 se
  • iPhone 核心数据:无法找到 NSManagedObjectModel

    我使用 Apple 的 CoreDataBooks 示例项目作为核心数据的学习辅助工具 我修改了应用程序 以便在加载应用程序时我首先显示菜单页面 而不是图书表视图 RootViewController 我做了以下事情 我在界面生成器中创建了
  • HttpClient setReachabilityStatusChangedBlock 声明没有接口

    尝试使用 AFNetworkings ReachabilityStatusChanged 但得到 HTTPCLIENT 没有可见的 interface 声明选择器 setReachabilityStatusChangeBlock 但Http
  • 核心数据executeFetchRequest消耗大量内存

    我正在核心数据数据库中插入 cca 100 000 条记录 数据库包含 3 个实体 球员 俱乐部 球员俱乐部 实体之间存在关系 玩家 gt 玩家俱乐部俱乐部 在 PlayerClub 中插入时 我注意到插入大约 50 000 条记录后会消耗
  • Objective-C 属性和内存管理

    给出以下属性定义 property nonatomic retain MyObject foo 以下代码是否会导致内存泄漏 self foo MyObject alloc init 看起来 alloc 调用将对象上的保留计数增加到 1 然后
  • 如何在禁用状态下更改 UIButton 图像 alpha?

    我有一个带有图像的 UIButton 在其禁用状态下 该图像应具有 0 3 alpha UIButton button UIButton buttonWithType UIButtonTypeCustom UIImage arrowImag
  • 使用 Java 检索 Window 进程的 CPU 使用率

    我正在寻找一个 Java 解决方案来查找 Windows 中正在运行的进程的 CPU 使用情况 查了一下网上 关于Java解决方案的信息似乎很少 请记住 我并不是要查找 JVM 的 CPU 使用情况 而是要查找当时在 Windows 中运行
  • 获取动画滚动视图的当前位置

    我遇到了以下问题 我对 uiscrollview 进行了子类化 其中 contentOffset 通过以下代码进行动画处理 UIView animateWithDuration 1 0 delay 1 0 options options a
  • 关闭 UITextView 的键盘而不使用 Return 键

    我正在使用 UITextView 并希望保留 Return 键的正常用法 即插入新行 但是 当我无法使用 Return 键时 如何关闭键盘呢 A lot of people add a UIToolbar with a Done butto
  • 我可以在主线程上读取一个小 txt 文件,还是应该始终避免那里的 I/O?

    我正在读取一个小的 json 文件 其中有几行 它存储在用户设备的内部应用程序文件夹中 我所做的就是这样 JSONObject jsonObject new JSONObject MyUtils inputStreamToString My
  • 当另一个线程发生事情时从主线程获取数据?

    目前我有一个线程正在运行一个侦听连接的套接字 当它收到连接时 它需要上传在主线程中收集的数据 即从主线程获取数据 但是 我传递了对象的实例 但它从未使用等待连接时收集的数据进行更新 有没有正确的方法来做到这一点 我用谷歌搜索了一下 似乎找不
  • Textview 中心文本对齐 IOS 7

    void observeValueForKeyPath NSString keyPath ofObject id object change NSDictionary change context void context NSLog He
  • Objective-C 中 NSURL 为 null 而 NSString 是正确的

    我有一个NSString包含一个 url 以及当我分配时NSURL与NSString NSURL 输出 空 这是因为url中有一些非法字符 导致NSURL不编码就无法读取NSString包含网址 NSString u incomingUrl
  • 出现错误:FT_Open_Face 失败:错误 2

    当我使用时出现以下错误CGContextDrawPDFPage context PDFPage 对于某些文件 有解决办法来解决这个问题吗 FT Open Face failed error 2 错误2看起来像errno2 这是 找不到文件
  • 为 UISlider 设置刻度线

    有没有为 UISlider 设置刻度线的方法 NSSlider 有一个叫做 void setNumberOfTickMarks NSInteger numberOfTickMarks 但 UISlider 似乎没有 我想要做的是将滑块值设置
  • 初始化Object中的空字符串?

    有人使用以下方法来初始化 NSstring NSString astring NSString alloc init 我想知道为什么不直接使用 NSString atring nil or NSString astring 没有semant

随机推荐

  • Strapi CMS:获取嵌套内容

    我正在使用 Strapi CMS 并努力获取嵌套 深层内容的数据 例如 假设我创建了以下内容类型并定义了关系 人物 姓名 年龄 地址 城市 国家 联系方式 代码 号码 一个人有一个地址 地址有很多联系人 现在的问题是 当我访问 person
  • 错误共享和原子变量

    当不同的变量位于同一个缓存行内时 您可以体验到虚假分享 这意味着即使两个不同的线程 在不同的内核上运行 正在访问两个不同的变量 如果这两个变量驻留在同一缓存行中 您也会受到性能影响 因为每次都会触发缓存一致性 现在说这些变量是原子变量 我所
  • 如何通过引用正确传递 Integer 类?

    我希望有人能为我澄清这里发生的事情 我在整数类中进行了一些研究 但是因为整数是压倒性的 the 操作员我无法弄清楚出了什么问题 我的问题是这一行 Integer i 0 i i 1 I think that this is somehow
  • 有黑莓浏览器模拟器吗?

    我正在开发一个需要在黑莓浏览器中运行的移动网站 这不是一个应用程序 只是一个带有自定义样式表的网站 是否有可用的 Blackberry 浏览器模拟器 或者我是否需要使用其中一个模拟器来为您提供整个 BB 系统 是的 你必须使用模拟器由 RI
  • 如何在 presto 中将 varchar 转换为 MAP(VARCHAR,VARCHAR)

    我在 presto 中有一个表 名为 映射 的一列将键值对作为字符串 从 hello 中选择映射 例如 foo baar foo1 bar1 我想将 映射 列转换为 MAP 就像从 hello 中选择 CAST mappings as MA
  • C++ cout 给出未声明的标识符

    所以 我有这个问题 为什么 cout 会抛出异常 error C2065 cout undeclared identifier 我正在使用 Visual Studio 2012 作为 IDE 并且正在编写一个学校项目 除了示例文件之外 我已
  • 在没有 xorg 的 Linux 上运行 chrome headless

    是否可以在无头 Linux 机器上安装和运行 chrome headless 而无需安装音频和 xorg 依赖项 如果没有 那么是否有一个特殊的 chrome chromium 无头版本 它不会提取 xorg 和音频库 这个关于 puppe
  • Spring boot - MySQL 设置不起作用

    我正在尝试使用 Spring boot 和 MySQL 开发一个应用程序 正如文档所说 首先我使用 Intelij Idea 使用 Springinitializr 创建了项目 配置了application properties文件 并写道
  • 如何动态更改 Crypt 在 Laravel 中使用的密钥?

    我一直在研究如何使用Laravel 加密因为建立一个宅基地加密平台是不受欢迎的 也是理所当然的 Illuminate Support Facades Crypt encryptString This is a secret message
  • 从量角器激活时激活 chrome 语言标志(selenium)

    我正在使用 Protractor 为一个有角度的网站编写端到端测试 我们必须支持某些语言 所以我想使用以下命令来初始化 chrome lang标记并用其他语言启动它 我搜索了网络 但找不到任何有关如何完成此操作的示例 我唯一的线索是我看到并
  • Jitsi SIP Communicator 安装程序

    在完成更改后 我必须为 Jitsi SIP Communicator 创建安装程序 我在网上搜索并发现了一些步骤 如下所示 软件要求 西格温 包含库 make gcc 和 g http cygwin com setup exe 明GW 仅
  • 使用内联CSS - 在某些情况下是禁忌还是可以? [复制]

    这个问题在这里已经有答案了 可能的重复 内联样式与 CSS 中的样式 我想我正在寻找对此的一些意见 我完全赞成在单独的 css 文件中使用 css 样式作为类 但每隔一段时间 我就会遇到一种情况 我只需要为特定元素进行一些填充 或者仅在一种
  • 使用.NET捕获屏幕截图[重复]

    这个问题在这里已经有答案了 可能的重复 如何以位图形式捕获屏幕 我需要制作一个应用程序 每当按下特定按钮时都会捕获当前屏幕的快照 我搜索了很多 但只找到了如何捕获当前窗口 您能帮我弄清楚如何在 NET 中执行此操作吗 我们可以通过点击打印屏
  • mysql RAND() 限制

    您好 我有一个这样的查询 SELECT otel id FROM YAZILIM menu icerik WHERE YAZILIM menu icerik menu id 39 AND otel id IN SELECT otel id
  • 比较 Javascript 中的日期和时区

    当使用 gt 和 当您将其转换为 JavaScript 时 将按照您的预期考虑时间戳字符串表示形式的时区部分Date对象 内部值是一个简单的标量 标准化为UTC 所以比较时不需要特殊的时区处理Date对象 var d1 new Date D
  • Javascript 日期,这是我的错误还是我发现了错误?

    我的应用程序中有一个简单的 Javascript 部分 其中有一个链接 添加日期 它会在日期上添加 1 天 它总是工作得很好 除非日期是 11 07 2010 然后链接突然不再工作 它真的很奇怪 因为它只在特定日期 11 07 2010 挂
  • GCC 编译时抛出错误:错误:未知类型名称“FILE”

    我正在制作一个只写的函数 hello 到一个文件 我已将其放在另一个文件中 并将其标头包含在程序中 但 gcc 给出了一个错误 error unknown type name FILE 代码如下 app c include
  • 缩放 SKNode 不一致

    我已经创建了自己的解决方案 用于放大或缩小特定的 SKNode 而无需缩放整个场景 它似乎主要按照我期望的方式工作 有 2 个值得注意的例外 我希望在这里得到输入 首先是代码 该控制语句位于touchesMoved方法内 if touche
  • 使用jquery更改给定特定宽度范围的类名(媒体查询)

    我正在尝试修改以下 html div class col1 width8 img src images entity jpg div 我想使用媒体查询 但我不想修改css 而是将类名从width8替换为width6 对于下面的标准媒体查询来
  • iPhone 3GS 上后台线程消耗 100% CPU 导致潜在主线程

    在我的应用程序中 我在 NSOperationQueue 中执行 10 个异步 NSURLConnections 作为 NSInitationOperations 为了防止每个操作在连接有机会完成之前返回 我调用 CFRunLoopRun