iOS启动后台线程

2023-11-26

我的 iOS 设备中有一个小型 sqlitedb。当用户按下按钮时,我从 sqlite 获取数据并将其显示给用户。

我想在后台线程中执行此获取部分(以免阻塞 UI 主线程)。我这样做-

[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];

获取并进行一些处理后,我需要更新 UI。但因为(作为一个好的实践)我们不应该从后台线程执行 UI 更新。我打电话给selector在主线程上像这样 -

[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];

但我的应用程序在第一步就崩溃了。即启动后台线程。这不是iOS启动后台线程的方法吗?

更新1: After [self performSelectorInBackground....我得到这个堆栈跟踪,没有任何信息 -

enter image description here

更新2:我什至尝试过,像这样启动后台线程 -[NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];但我仍然得到相同的堆栈跟踪。

只是为了澄清一下,当我在主线程上执行此操作时,一切都运行顺利......

UPDATE 3这是我尝试从后台运行的方法

- (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids
{
    SpotMain *mirror = [[SpotMain alloc] init];
    NSMutableArray *filteredDocids = toProceessDocids;

    if(![gMediaBucket isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1];
    if(![gMediaType isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType numRes:-1];
    if(![gPlatform isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForPlatformID:filteredDocids platformId:@"1" numRes:-1];

    self.resultSet = [mirror FetchObjectFromDocid:filteredDocids];
    [filteredDocids release];
    [mirror release];

    [self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
    return;
}

如果你使用performSelectorInBackground:withObject:要生成一个新线程,那么执行的选择器负责设置新线程的自动释放池、运行循环和其他配置详细信息 - 请参阅“使用 NSObject 生成线程”在苹果的线程编程指南.

你可能最好使用大中央快讯, 尽管:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self getResultSetFromDB:docids];
});

GCD 是一种较新的技术,在内存开销和代码行方面更加高效。


Updated带着帽子小费克里斯·诺莱特,他建议进行一项更改,使上述代码更简单,并与 Apple 最新的 GCD 代码示例保持一致。

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

iOS启动后台线程 的相关文章

  • 使用 Python 查找 Mac OS X 中的当前活动窗口

    有没有办法使用 Python 在 Mac OS X 上查找给定时间当前活动窗口的应用程序名称 这应该有效 usr bin python from AppKit import NSWorkspace activeAppName NSWorks
  • Python - 如何实现“可停止”线程?

    已经发布解决方案了here https stackoverflow com questions 323972 is there any way to kill a thread in python创建一个可停止的线程 但是 我在理解如何实施
  • 应用因广告标识符 (IDFA) 被拒绝

    我的申请因以下原因被拒绝 您和您的应用程序 以及与您有联系的任何第三方 签订广告服务合同 可以使用广告标识符 以及通过使用广告获得的任何信息 标识符 仅用于服务广告的目的 如果一个用户 重置广告标识符 则您同意不合并 直接或间接关联 链接或
  • Braintree DropIn + Apple Pay,未出现 Apple Pay 项目

    我成功调用DropIn来自 Braintree SDK 的视图 这BTDropInRequest设置应显示三项 PayPal 信用卡 苹果支付 但由于某种原因在DropIn视图仅呈现两个项目而不是三个 PayPal 信用卡 我做错了什么 准
  • iOS:保持应用程序在后台运行

    如何让我的应用程序在后台运行 我需要越狱我的 iPhone 才能执行此操作吗 我只需要这个应用程序每隔设定的时间间隔从互联网上检查一些内容 并在需要时发出通知 以供我自己使用 是的 不需要越狱 查看本文档的 实现长时间运行的后台任务 部分A
  • 使用 NSJSONSerialization 解析 JSON

    对此进行了太多讨论 但我不知道如何解决我的问题 这是我从 WorldWeatherOnline 获取的 JSON 数据 JSON 有效 但我不知道如何解析它 这是我的代码 后面是 JSON 请帮忙 NSError errorInfo NSD
  • 如何在Java中执行特定时间段的任务?

    事实上 我会在确定的时间内执行特定的任务 一组指令 例如 我希望我的程序执行任务 5 分钟 如果它得到正确的结果 它会停止 否则它将继续执行正常任务 5 分钟 最后它告诉我 我怎样才能用Java实现这个 你可以像下面这样 import ja
  • 在 UITableView 中设置滚动位置

    我有一个应用程序 其工作方式与 iPhone 的 联系人 应用程序的工作方式有些相似 当我们添加新的联系人时 用户将被定向到包含联系人信息的仅查看屏幕 如果我们从导航栏中选择 所有联系人 用户将导航到查看最近添加的联系人的所有联系人列表 我
  • 从后台唤醒时应用程序会重新启动

    iOS 大师您好 我已经广泛搜索了答案 但找不到答案 我打赌对我的问题的第一个答复将是另一个类似的问题 但我找不到它 不管怎样 我的问题是我正在运行一个简单的地图应用程序 用户可以在地图上放置图钉 并在放置的图钉周围有一个自定义的圆圈覆盖
  • 核心蓝牙在后台进行广告和扫描

    我一直在尝试设置一个应用程序 使设备既扫描外围设备又作为外围设备进行广告 目标是当两个设备通过蓝牙发现彼此靠近时在后台被唤醒 从 Apple 文档来看 您似乎应该能够在后台运行 BLE 启用蓝牙中心和蓝牙外设后台模式 并且当一台设备位于前台
  • 在c99中使用__thread

    我想使用 thread 存储类定义一些特定于线程的变量 但三个问题让我犹豫不决 它真的是c99的标准吗 或者更重要的是 编译器支持有多好 变量会在每个线程中初始化吗 非多线程程序是否将它们视为普通的旧全局变量 回答您的具体问题 不 它不是
  • 如何修复C风格的for语句?

    什么是正确的修复方法C 风格的 for 语句对于下面发布的代码 目前我正在交战 C 风格的 for 语句已弃用 并将在将来删除 斯威夫特的版本 var ifaddr UnsafeMutablePointer
  • 检测您何时进入/退出 Xamarin.iOS 中的主线程

    Xamarin MonoTouch 有没有办法检测主线程中是否正在调用代码 我正在寻找类似于Java的东西EventQueue isEventDispatchThread 我发现 Swing 编程很方便assert时不时 或有时assert
  • 在 Objective C 中使用下划线作为属性名称前缀 [重复]

    这个问题在这里已经有答案了 我以前避免在变量名中使用下划线 这可能是我大学 Java 时代的遗留下来的 因此 当我在 Objective C 中定义属性时 我自然会这样做 In the header interface Whatever N
  • Java 线程 JavaDoc

    我编写了一个只能在特定线程上调用的方法 是否应该将标准注释或注释添加到方法的 javadoc 中来表示这一点 不知道有任何这样的标准注释 Java 并发实践 http www javaconcurrencyinpractice com 在第
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 使用 JavaScript 从 URL 变量读取来加载不同的 CSS 样式表

    我试图在我的 WordPress 博客上使用两个不同的样式表 以便在通过 Web 访问页面时使用一个样式表 而在通过我们的 iOS 应用程序访问博客内容时使用另一个样式表 现在 我们将 app true 附加到来自 iOS 应用程序的 UR
  • .NET 或 Windows 同步原语性能规范

    我目前正在写一篇科学文章 我需要非常准确地引用 有人可以向我指出 MSDN MSDN 文章 一些已发表的文章来源或一本书 我可以在其中找到 Windows 或 NET 同步原语的性能比较 我知道这些是按性能降序排列的 互锁 API 关键部分
  • 我可以在 NS_SWIFT_NAME 中使用保留关键字吗?

    我正在尝试使 Objective C 委托协议更漂亮以便在 Swift 中使用 但我在弄清楚如何使用时遇到了一些麻烦NS SWIFT NAME 是否可以使用NS SWIFT NAME指定 Swift 名称中与 Objective C 关键字
  • 适用于 iOS 的 Google Cast SDK 2.3.0 不支持 64 位

    似乎是适用于 iOS 的 Google Cast SDK 2 3 0 版本 https developers google com cast downloads GoogleCastFramework 2 3 0 Release zip停止

随机推荐

  • 如何将数据(json)传递给vue实例

    我有一个简单的 Vue 实例 希望在没有 HTTP 请求的情况下将 json 从后端传递到 vue 因为它总是相同的 我尝试过用 props 做到这一点 但它不起作用 在 DOM 中它看起来像 div Vue 调试工具将图像显示为空字符串
  • PHP并发HTTP请求?

    我想知道在 PHP 中执行并发 HTTP 请求的最佳方法是什么 我有很多数据要获取 我宁愿一次执行多个请求来检索全部数据 有人知道我该怎么做吗 最好以匿名 回调函数的方式 Thanks Tom 您可以使用卷曲多 它在单个curl句柄下内部触
  • java中如何指定文件路径?

    我已经为 Debian Linux 创建了一个java应用程序 现在我希望该应用程序读取放置在指定该应用程序的 jar 文件的目录中的文件 那么在文件对象的参数中要指定什么 File fileToBeReaded new File 为上述语
  • 你现在如何在前端使用 es6 Promise?

    我正在尝试使用 babel 编译包含 es6 Promise 的文件 我已经安装了 babel cli babel preset es2015 babel plugin es6 promise 我的 babelrc 配置是 presets
  • 在 Eclipse 项目中链接名为“src”的外部源文件夹

    这不是关于在 eclipse java 项目中链接源的问题 是否可以在 eclipse 中添加一个名为 src 的外部文件夹作为源文件夹 这里的问题是将外部文件夹名称保留为 src 而不是任何其他名称 为此 我尝试从标准 eclipse j
  • UIScrollview 动画取决于内容偏移量

    我正在使用水平 UIScrollView 并且我想要根据内容偏移的 x 值进行背景颜色过渡 Example UIScrollView的宽度是640px 当内容偏移量等于0px时 背景颜色必须为红色 当内容偏移量为 320 px 时 背景必须
  • VB.NET 关键字“Is”与 Object.ReferenceEquals 相同吗?

    Is the IsVB NET 关键字与 Object ReferenceEquals 相同吗 是的 是的 除非与 TypeOf 检查结合使用 引用自MSDN Is 运算符确定是否两个 对象引用指的是相同的 目的 然而 它不执行 价值比较
  • 有哪些技术可以绕过 IE 文件下载安全规则?

    Internet Explorer 使用默认设置 我通常认为这将在 Great Unwashed 的桌面上生效 似乎不喜欢在 HTTP 响应中接受附件内容的想法 如果相应的请求不是直接从用户操作发出的 就像 点击 处理程序或本机表单提交 可
  • Raku rebless 不再适用于继承类

    该线程中给出的代码不再起作用 如何在 Perl 6 中重新定义对象 这段代码是我去年写的 当时就有效了 现在它没有 class Person class Woman is Person my tom Person new my lisa W
  • 重定向到 Node.js 中的不同页面 url(不在 Express 或其他框架中)

    我想将用户从 Node js 中的一个页面重定向到另一个页面 普通 Node js 现实生活场景 注册后 example com sigup 成功注册后我想将用户重定向到登录页面 example com login if signUpSuc
  • 如何在 SignalR 2.x 单元测试框架中向模拟客户端添加组支持?

    我正在使用 Moq 为我的 SignalR 2 x 应用程序构建一个 UnitTest 框架 我目前正在通过以下方式嘲笑我的客户 var mockClients new Mock
  • 将 Xcode 7 与 iOS 10 结合使用

    我想在 iOS 10 中使用 Xcode 7 据我了解 使用 iOS 10 beta 需要 Xcode 8 beta 所以我应该升级我的 Xcode 但是 我的代码无法由新编译器构建 因此我想继续使用 Xcode 7 我怎样才能做到这一点
  • 如何使用 Hibernate 注释在连接表上创建索引?

    我使用 Hibernate 注释有如下关系 这是我尝试过的 public class Job OneToMany cascade CascadeType ALL JoinTable name jobs resource locations
  • 使用 pandas read_csv 时出现内存错误

    我正在尝试做一些相当简单的事情 将一个大的 csv 文件读入 pandas 数据帧 data pandas read csv filepath header 0 sep DELIMITER skiprows 2 该代码要么失败 并显示Mem
  • 最小成本流 - R 中的网络优化

    我正在尝试实施一个 最低成本网络流量 交通问题解决方案R 我知道这可以使用类似的东西从头开始实现lpSolve 不过我发现有一个方便的igraph实施 最大流量 这样一个预先存在的解决方案会方便很多 但我找不到最小成本的等效函数 有没有一个
  • 如何让 JTable 标题显示整个列名而不是缩短它们?

    我有一个 JTable 其中填充了一个扩展 AbstractTableModel 的类 问题是列太短而无法显示列名称 我已经关闭了 Jtable AutoResizeMode 属性 但缩短仍然发生 我该如何解决这个问题 您可以使用桌柱调节器
  • 从 Bash 目录中读取文件名

    我需要编写一个脚本 从目录中读取所有文件名 然后根据文件名 例如 如果它包含 R1 或 R2 它将连接所有包含的文件名 例如名称中的 R1 谁能给我一些如何做到这一点的提示 我唯一能做的就是 bin bash FILES path to t
  • 使用 boto3 列出具有特定应用程序标签的自动缩放组名称

    我试图获取应用程序标记值为 CCC 的自动缩放组 名单如下 gweb prd dcc eap w2 gweb prd dcc emc gweb prd dcc ems CCC dev ccc wer CCC dev ccc gbg CCC
  • Facebook Graph API 覆盖显式设置的隐私设置

    我在为我的应用程序代表用户创建的帖子设置隐私时遇到问题 问题是 所有帖子的隐私值都被 Graph API 设置为 ALL FRIENDS 即使我明确将隐私值设置为 EVERYONE 这是我用来提交的代码 query message urle
  • iOS启动后台线程

    我的 iOS 设备中有一个小型 sqlitedb 当用户按下按钮时 我从 sqlite 获取数据并将其显示给用户 我想在后台线程中执行此获取部分 以免阻塞 UI 主线程 我这样做 self performSelectorInBackgrou