从 NSOperationQueue 取消 NSOperation 导致崩溃

2024-01-06


我正在尝试构建一个下载管理器类,它将所有异步下载(每个操作都有自己的线程)操作打包到 NSOperation 子类中,以便稍后将它们添加到 NSOperationQueue 中。下载管理器类(单例)还公开了一些方法来处理队列并取消符合某些要求的操作。
这些是开始创建类集群(抽象工厂)的步骤,该类集群为不同类型的常见操作(上传、下载、解析等)返回不同类型的 NSOperation。
该类似乎可以很好地处理下载操作,但如果在这些操作中间我调用取消操作的方法,则该操作会成功取消,但应用程序会在稍后的几个操作中崩溃。如果我不取消任何操作,一切都会正常。所有操作均使用 KVO 进行观察。 删除操作的方法如下所示:

- (void) cancelDownloadOperationWithID:(NSString *)aUUID{
@synchronized(self){
    [self.dowloadQueue setSuspended:YES]; //downloadQueue is an NSOperationQueue
    NSArray * downloadOperations = [self.dowloadQueue operations];
    NSPredicate * aPredicate = [NSPredicate predicateWithFormat:@"SELF.connectionID == %@",aUUID]; //SELF is the signleton instance of the download manager
    NSArray * filteredArray = [downloadOperations filteredArrayUsingPredicate:aPredicate];
    if ([filteredArray count]==0) {
        [self.dowloadQueue setSuspended:NO];
        return;
    } 
    [filteredArray makeObjectsPerformSelector:@selector(cancel)];
    NSLog(@"Cancelled %d operations",[filteredArray count]);
    [self.dowloadQueue setSuspended:NO];
   }
}

崩溃日志非常难以理解,但是是一个 BAD_EXC_ACCESS (可能是僵尸),请注意我处于 ARC 下。

0x00a90ea8  <+0393>  jle    0xa90d9f <____NSOQSchedule_block_invoke_0+128>
0x00a90eae  <+0399>  mov    -0x38(%ebp),%ecx
0x00a90eb1  <+0402>  mov    -0x34(%ebp),%esi
0x00a90eb4  <+0405>  mov    (%esi,%ecx,1),%ecx
0x00a90eb7  <+0408>  mov    -0x40(%ebp),%esi
0x00a90eba  <+0411>  cmpb   $0x0,(%ecx,%esi,1)
0x00a90ebe  <+0415>  jne    0xa90d9f <____NSOQSchedule_block_invoke_0+128>
0x00a90ec4  <+0421>  mov    (%edi,%eax,1),%esi
0x00a90ec7  <+0424>  mov    (%esi,%edx,1),%ebx
0x00a90eca  <+0427>  mov    %ebx,-0x2c(%ebp)
0x00a90ecd  <+0430>  mov    -0x44(%ebp),%ebx
0x00a90ed0  <+0433>  cmpl   $0x50,(%esi,%ebx,1)
0x00a90ed4  <+0437>  mov    %edi,%ebx
0x00a90ed6  <+0439>  jne    0xa90e96 <____NSOQSchedule_block_invoke_0+375>
0x00a90ed8  <+0441>  mov    -0x48(%ebp),%ebx
0x00a90edb  <+0444>  cmpb   $0x0,(%esi,%ebx,1)
0x00a90edf  <+0448>  mov    %edi,%ebx
0x00a90ee1  <+0450>  je     0xa90e96 <____NSOQSchedule_block_invoke_0+375>

有人可以给我建议吗?
感谢安德里亚


答案很简单。在 NSOperation 子类的重写 -cancel 方法中,我设置了已完成的变量和正在执行的变量,以触发正确的 KVO 回调。问题是,即使取消操作,操作也会保留在 NSOperationQueue 中,当队列尝试在已触发其 KVO 回调的 NSOperationQueue 上启动 -start 方法时,它会崩溃。

解决方法如下:如果操作在未执行时被取消,则必须在执行 start 方法后立即将 finish 变量设置为 YES,否则如果正在执行,则可以将 finish 设置为 YES 并将执行设置为 NO。

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

从 NSOperationQueue 取消 NSOperation 导致崩溃 的相关文章

  • 在 iOS 中发送音频文件和 JSON 字符串

    我正在尝试将音频文件和 JSON 字符串发送到 PHP 服务器 使用以下代码将发送 JSON 但文件到达时为空 如果我将 JSON 块放在音频块下方 文件将完全到达 但 JSON 为空 有什么想法吗 void sendFile NSStri
  • SwiftUI DisclosureGroup 单独展开每个部分

    我正在使用 Foreach 和 DisclosureGroup 来显示数据 每个部分都可以展开 折叠 然而 它们都在同时扩展 折叠 如何单独展开 折叠每个部分 struct TasksTabView View State private v
  • iOS - UIBarButtonItem - 后退按钮标题垂直位置不调整

    我正在设置自定义字体UIBarButtonItem对象使用UIAppearance 这工作正常并正确设置字体 但是 我确实需要调整按钮标题的垂直位置以适应新字体的大小 UIBarButtonItem appearance setTitleT
  • React Native Detox:无法接受系统警报弹出的位置权限

    使用以下命令从命令行启动应用程序detox test configuration ios sim debug 通过代码启动应用程序await device launchApp permissions location always noti
  • 寻找可靠的方法来选择iPhone 13微距相机设备

    我正在使用 objc 开发一个应用程序 我必须选择 iPhone 13 Pro 和 13 Pro Max 中配备的新微距摄像头 目前 我在所有其他设备上选择我的相机 并剪掉此代码 AVCaptureDeviceDiscoverySessio
  • UICollectionViewCell 拖动预览的自定义视图

    我正在尝试实现一项功能 用户可以将一个集合视图单元格拖放到另一个集合视图单元格上 但是 我想完全更改运动中物体的预览 以匹配我的应用程序的视觉隐喻 该项目没有移动 该项目包含的东西正在移动 例如 假设我的collectionview单元格显
  • iOS8 自签名证书已安装但仍不受信任

    由于我无法控制的原因 我需要使用自签名证书针对平台进行 iOS 开发 它是一个在 SAN 中具有特定 IP 地址的根证书 当证书安装在 OSX 系统帐户下时 所有浏览器现在将正常信任对给定 IP 地址的任何访问 通过电子邮件将同一证书发送到
  • 如何在 iOS 中创建多行表格单元格?

    如何让第二个单元格扩展以适合文本而不是缩放文本 iOS 中有内置的方法可以做到这一点 还是我必须想出一些自制的解决方案 如果您查看 iOS 联系人应用程序 会发现有一个类似地址的框 但我找不到如何实现这一点 对于任何希望将来实现这一目标的人
  • Objective c RSA 与 OAEP 填充 sha256 之前的 ios 10

    我正在研究一种在iPhone中使用RSA加密方法的加密方法 到目前为止我可以用这种方法实现获取加密字符串 该字符串被服务器成功解密 SecKeyRef keyRef self addPublicKey pubKey SecKeyAlgori
  • 以编程方式更改自动布局约束后视图未更新

    事先我必须说 我实际上得到了我想要的可见效果 但不是以令人满意的方式 因为现在需要 打破 约束而不是正确更新 我有一个 ViewController 其中包含一个 UITableView 那个的高度tableView可以从 0 不可见 到它
  • 从 iPhone 传输视频

    我可以从 iPhone 的相机中获取单独的帧 我需要的是一种将它们与声音打包以便流式传输到服务器的方法 收到文件后发送它们并不是什么大问题 我遇到问题的是流媒体文件的生成 我一直在尝试让 FFMpeg 工作 但运气不佳 有人对我如何实现这一
  • UISearchDisplayController—为什么我的搜索结果视图包含空单元格?

    我快要疯了 在我的核心数据数据库中 我有很多用户 我已经通过 NSFetchedResultController 将数据库连接到 tableviewcontroller 当视图加载时 我看到了所有用户 我可以通过 Storyboard Se
  • AST 文件格式错误或损坏

    我有一个问题 我不知道为什么会发生这种情况 但很可能是因为我错误地按了 移动到垃圾箱 到某些系统框架 我收到一条错误消息 AST 文件格式错误或损坏 找不到 AST 文件引用的文件 Users username myProject Quar
  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • Xcode 7.2 无法连接到装有 iOS 9.2 的 iPhone

    出于开发目的 我已经在我的 iPhone 5s 上安装了 iOS 9 2 beta 当然 我还安装了Xcode 7 2 beta 当我想在设备上运行应用程序扩展 键盘 时 该应用程序会正确构建 安装在 iPhone 上并启动 然而 然后我在
  • Swift 字典映射 - 闭包中的 init

    我有 Swift 字典 private var params String AnyObject 这包含查询项目 例如 lat 40 lon 100 我想将这本词典映射到NSURLQueryItem大批 我想让它 迅速 params map
  • Quartz 2D/OpenGLES 图像上的几何变形(最好使用 CGImage)

    实现诸如收缩 鱼眼等几何变形的首选方法是什么 使用iPhone SDK 我知道 OSX 的 Core Image 库内置了所有这些类型的过滤器 但 iPhone SDK 没有 我可以在给定原始源位图数据的特定位置和半径处创建位移图 但我不确
  • iOS 上的推送通知渐进式 Web 应用程序

    我需要开发一个集成了推送通知的渐进式网络应用程序 在网上搜索我发现了关于这个主题的不同意见 如果我理解正确的话 目前我们无法在移动版 safari 中推送通知 但仅限桌面版 这样对吗 你有什么建议来获得相同的结果吗 我不是iOS专家 我想知
  • 为 UISlider 设置刻度线

    有没有为 UISlider 设置刻度线的方法 NSSlider 有一个叫做 void setNumberOfTickMarks NSInteger numberOfTickMarks 但 UISlider 似乎没有 我想要做的是将滑块值设置
  • 在启动屏幕中执行代码已更新

    在原始启动屏幕中执行代码 https stackoverflow com questions 27642016 execute code in launch screen 现在默认的LaunchScreenXcode 项目中的文件已更改为

随机推荐

  • Nodejs 模块和重复?如果应用程序使用两个需要公共模块的模块,节点是否会进行优化以防止加载相同的代码两次?

    如果这是一个愚蠢的问题 我深表歉意 但是如果我创建两个模块 它们都需要 http 并且我的主应用程序需要这两个模块 或者需要模块 而这些模块又需要这两个模块 同时还需要 http 作为其自己的模块目的 我最终会得到 http 模块的三个实例
  • 使用 Lambda 语法的 C# LINQ 多个 GroupJoin

    我有 3 个表 我试图使用左连接将它们组合在一起 在我的应用程序中 所有 LINQ 表达式都是查询链格式 lambda 表达式 我试图弄清楚如何使用 LINQ 完成这个查询 这是我的 SQL 查询 select i INVOICE NUMB
  • 关于 SimpleModal jQuery 插件的问题——初始打开后可以重新居中吗?

    我的问题与SimpleModal jQuery 插件 http www ericmmartin com projects simplemodal 我打开模态窗口没有问题 但是一旦它打开 它就会停留在屏幕上 居中 的位置 但是它的内容正在发生
  • 如何防止在 Razor(独立)中转义 html?

    我有一个模型 其属性 Content 包含 HTML 字符串 var model new Content Razor Parse templateBody model 如何使用独立 Razor 渲染此字符串 I tried new Html
  • 为什么在 try 块中重新声明函数标识符会引发语法错误?

    以下 JavaScript 行 try function free var free 1 finally 导致以下错误 Uncaught SyntaxError Identifier free has already been declar
  • R 中从右到左的语言支持(使用 Mac)

    我想知道在使用 Mac 时是否有支持 R 中从右到左语言的方法 例如假设以下代码 x lt data frame a runif 10 b runif 10 ggplot x aes a b geom point xlab 结果如下 在这里
  • 绑定到静态类实例中的属性

    我想要实现的目标 我有一个 WPF 应用程序 仅用于测试 我想将标签的文本 内容 绑定到某处的属性 这个想法是 当用户选择不同的语言时 该属性值将会改变 当属性更改时 我希望标签文本更新为新值 我尝试过的 我尝试创建一个具有标签值静态属性的
  • 检查 Internet Explorer 中的伪元素

    我有以下伪元素 input type radio selected before 在互联网浏览器中 伪元素根本不显示 所以我决定看一下 我在检查器中找到了选择器 检查器中的选择器将是一本很棒的儿童读物 但是所有属性都被删除了 即覆盖 无效
  • webpack 构建中意外的令牌“导出”

    我收到的错误是 webpack 无法将导出识别为关键字 我已经更新了 babelrc 并安装了必要的依赖项 我确信这与不理解 es6 有关 但我找不到解决我的问题的解决方案 以下是查看我的依赖项 错误和重要文件所需的文件 index scs
  • Google Go 语言中哪些类型是可变的和不可变的?

    在 Google Go 中 我读到字符串是不可变的 好吧 但是是 int 吗 那么其他类型呢 作为一个稍老的程序员 我更喜欢可变性 尽管我知道不变性的好处 但我更喜欢危险地生活 了解哪些类型是可变的或不可变的将非常有帮助 更新 我最关心的是
  • tools/bazel.rc 如何与外部工作区依赖项一起使用?

    如果我将外部 Bazel 项目作为 WORKSPACE 依赖项拉入 并且该项目有一个 tools bazel rc 添加了一些默认构建选项并定义了一些构建 config 选项 那么它到底是如何工作的 构建这些外部构建目标时是否使用这些默认选
  • 如何显示 Cabal 项目的依赖关系树

    我在用cabal v2 build构建一个项目 但它在我不直接依赖的包上不断失败 有没有办法与cabal列出包的所有依赖项 最好以树格式 这样我就可以看到我所依赖的调用构建失败的内容并 希望 摆脱它 Try cabal plan https
  • 如何保存 HTML5 画布?

    目前我正在使用画布2图像 http www nihilogic dk labs canvas2image 保存 HTML5 画布的内容 然而 它似乎不适用于 Google Chrome 欢迎任何有关如何解决该问题的想法 canvas toD
  • 我可以使用委托的单个实例来启动多个异步请求吗?

    只是想知道是否有人可以澄清使用BeginInvoke当您想要进行多个异步调用时 在某个委托的实例上 因为 MSDN 文档根本没有真正涵盖 提及这一点 我想做的是类似以下的事情 MyDelegate d new MyDelegate this
  • 我的表需要更多标准化吗?

    我正在制作一个简单的公共现金簿数据库表来计算我和我的朋友一起吃饭花了多少钱 我的第一个表只是一个表 它有一个具有非原子值的 person 列 所以我将表分成两个表 如上所示 但我不确定这是否足够正常化 是否存在任何应该规范化的功能依赖性 但
  • Google 数据源 JSON 无效吗?

    我正在使用他们的Google数据源来实现Python库 http code google com apis visualization documentation dev gviz api lib html tojsonexample 我希
  • Android 2.3 的 ActionBarCompat 中没有 FEATURE_INDETERMINATE_PROGRESS -

    我在用着 requestWindowFeature Window FEATURE INDETERMINATE PROGRESS setSupportProgressBarIndeterminateVisibility true setSup
  • regsvr32 是否有 .NET 或 Win32 版本?

    regsvr32 是否有 NET 或 Win32 版本 我想用代码注册一个 COM DLL 而不是使用 regsvr32 程序 注册程序集的标准方法是调用导出的DllRegisterServer装配体上的功能 http msdn micro
  • 如何以编程方式重新加载 Visual Studio Code 窗口?

    用户可以通过编辑器的 命令面板 运行 重新加载窗口 来实现此目的 然而 从扩展创作的角度来看 这并不像立即提示用户那么简单 期望的结果是将当前的实施this https github com xabikos vscode javascrip
  • 从 NSOperationQueue 取消 NSOperation 导致崩溃

    我正在尝试构建一个下载管理器类 它将所有异步下载 每个操作都有自己的线程 操作打包到 NSOperation 子类中 以便稍后将它们添加到 NSOperationQueue 中 下载管理器类 单例 还公开了一些方法来处理队列并取消符合某些要