问题标签 [dispatchworkitem]

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 回答
19078 浏览

swift - 如何在 GCD 中停止 DispatchWorkItem?

我目前正在玩Grand Central Dispatch并发现了一个名为DispatchWorkItem. 文档似乎有点不完整,所以我不确定是否以正确的方式使用它。我创建了以下代码段并期望有所不同。我预计该项目将在调用后被取消cancel。但由于某种原因,迭代仍在继续。任何想法我做错了什么?代码对我来说似乎很好。

0 投票
1 回答
1010 浏览

swift - 为什么 DispatchWorkItem 会通知崩溃?

我刚刚开始在 Swift 编程语言中学习更多关于 Grand Central Dispatch 的知识。

我按照在线教程更好地理解 GCD 并尝试了各种使用示例......

在有关工作项的部分中,我编写了以下代码:

该代码基本上在两个不同的队列(主队列和全局队列)中执行工作项,当工作项在两个队列中完成运行时,我得到了结果。

上面代码的输出是:20。

当我尝试稍微操作代码并将另一个队列添加到混合中并运行与qos全局队列(.utility)相同的相同工作项时,如下所示:

应用程序崩溃。

但是当我更改命令的顺序时,我将方法移动到workItem.notify方法的开头,应用程序工作并给我正确的输出,即 25 :

任何人都可以帮助了解该.notify()方法的实际工作原理吗?为什么命令的顺序有所不同?

非常感谢提前...

0 投票
1 回答
4412 浏览

ios - Swift iOS -DispatchWorkItem 仍在运行,即使它被取消并设置为 Nil

我使用 GCDDispatchWorkItem来跟踪发送到 firebase 的数据。

我要做的第一件事是声明 2 个类型的类属性,DispatchWorkItem然后当我准备好将数据发送到 firebase 时,我用值初始化它们。

第一个属性名为errorTask。初始化它cancels并将firebaseTask其设置为nil然后打印“errorTaskfired”。如果DispatchAsync Timer在此之前没有取消 errorTask,它将在 0.0000000001 秒内调用它。

第二个属性名为firebaseTask。初始化时,它包含一个将数据发送到 firebase 的函数。如果 firebase 回调成功,则errorTask取消并设置为nil,然后打印一条打印语句“firebase 回调已到达”。我还检查了 firebaseTask 是否被取消。

问题是内部的代码errorTask总是在firebaseTask到达回调之前运行。errorTask代码取消并将其firebaseTask设置为 nil 但由于某种原因firebaseTask仍然运行。我想不通为什么?

print 语句支持 errorTask 先运行的事实,因为 "errorTask fired"总是在之前打印"firebase callback was reached"

即使 errorTask 使这些事情发生,为什么 firebaseTask 没有被取消并设置为零?

在我的实际应用程序中,如果用户向 Firebase 发送一些数据,则会出现一个活动指示器。一旦达到 firebase 回调,活动指示器就会消失,并向用户显示警报,说明它是成功的。但是,如果活动指示器上没有计时器并且从未达到回调,那么它将永远旋转。将DispatchAsyc after计时器设置为 15 秒,如果未达到回调,则会显示错误标签。10 次中有 9 次总是有效。

  1. 发送数据到FB
  2. 显示活动指示器
  3. 回调到达所以取消errorTask,将其设置为nil,并关闭活动指示器
  4. 显示成功警报。

但每隔一段时间

  1. 这将需要更长的时间然后 15 秒
  2. firebaseTask被取消并设置为零,活动指示器将被关闭
  3. 错误标签将显示
  4. 成功警报仍会出现

代码块关闭actiInd errorTask,显示 errorLabel,取消firebaseTask并设置它为 nil。一旦 firebaseTask 被取消并设置为 nil,我认为其中的所有内容也会停止,因为回调从未到达。 这可能是我困惑的原因。似乎即使firebaseTask被取消并设置为零,someRef?.updateChildValues(...它仍在运行,我也需要取消它。

我的代码:

0 投票
0 回答
69 浏览

ios - 如何在 Swift 中使这个 DispatchWorkItem 无效?

我正在制作一个计时器,它会在手机录制并使用过滤器进行一些繁重的工作时更新文本。由于某种原因,工作项似乎没有失效,因为当我回到我的视图时,我有一个额外的计时器来更新文本。每次我回去重新启动它时,这些都会堆积起来。

当我停止录制时,这个 DispatchWorkItem 不应该被扔掉吗?之后我什至试着让它为零。

我可能有的一个猜测是我需要创建一个全局 bool 以便我可以选择退出 for 循环,但我不知道为什么需要这样做。

编辑:我想我明白了,虽然我不知道它在技术上是否正确:

0 投票
3 回答
10457 浏览

ios - 快速同步多个 Web 服务调用以串行顺序

我正在点击一个网络服务 url 10 次并得到响应。我正在使用AlamofireSwiftyJSON。这是我的控制器代码

这是我的服务处理程序类代码

我正在发送一个带有 for 循环索引的计数器键,只是为了跟踪哪个索引返回的响应。但是响应不是按顺序排列的。我们可以在第 2 和第 1 响应之前期待第 3 响应。这是因为带有函数调用的 API 调用APIManager.apiGet是异步的,并且正在转义,因此会继续 for 循环。

我也使用了 dispatchQueue

并将函数转换为:

与服务调用代码是异步的结果相同。如果我们使

那么我们也不会以串行顺序获得响应,因为异步和 dispatchQueue 中的网络调用假定任务已完成。

条件是只在不冻结 UI 的情况下以异步方式访问服务。如果我打的服务是同步的方式,那么我会得到我想要的结果。但是阻塞主线程是完全不能接受的。

我可以使用数组或一些全局布尔变量来管理这个东西,但我不想使用它们。有没有其他方法可以按调用它的顺序获得响应?任何帮助或提示表示赞赏。

0 投票
1 回答
353 浏览

ios - 如何防止在 GCD 中释放对象?

此功能应该重新安排工作项的执行:

它在开发中运行良好,但设计似乎很可疑,所以我问了一些基本问题:

  1. 可能workItem是 nil,如果 workItem?.cancel()在队列尝试执行workItem?
  2. id执行时inside可能workItem是 nilworkItem还是由 scoped 保留let id = self.id
  3. 如果对象已被释放,isDoing内部workItem是否已经被释放?换句话说,当对象被释放时,调度会发生什么?workItemMyClassworkItemMyClass
0 投票
1 回答
3124 浏览

ios - 调用 .cancel() 时,DispatchWorkItem 未终止函数

我有一系列使用 Alamofire 在主函数中调用的函数列表中按顺序发出的 HTTP 请求runTask(),我希望能够停止这些请求。因此,我为我需要运行的每个任务设置了runTask()函数调用,并将工作项存储在一个数组中,如下所示:DispatchWorkItem

然后,我迭代工作项数组并调用perform()函数,如下所示:

最后,我的应用程序中有一个按钮,我想在点击时取消工作项,我有以下代码来实现这一点:

workItem.isCancelled打印到true; 但是,我在被调用的函数中设置了日志,runTask()即使workItem.cancel()被调用和workItem.isCancelled打印,我仍然看到函数正在执行true。我做错了什么,如何停止执行我的功能?

0 投票
1 回答
582 浏览

kotlin - Kotlin 是否有与 swift 中的“DispatchWorkItem”完全相同的东西?

我想在超时或满足某些特定条件后执行特定功能。我在 swift usingDispatchWorkItem和 used中做了同样的事情

启动计时器并在 10 秒后执行相关的 disptachWorkItem。

如何在 Kotlin 中做到这一点?

0 投票
0 回答
270 浏览

arrays - DispatchWorkItem 不会立即取消任务

我有一个讨厌的搜索问题。

有一个包含30000个对象和一个textView的结构数组,输入字母时,我删除空格并在searchText中设置文本,searchText有WillSet和DidSet,在WillSet中我取消所有旧文本的搜索任务并开始搜索新文本已设置。在search()函数中,我遍历数组并向函数中的 DispatchWorkItem 添加逻辑,当我输入大量字符时anyTranslate(),searchText 会出错。- [CFString length]: message sent to deallocated instance我创建了一个test不应该为真anyTranslate()但有时打印为真的变量类型,只有当测试等于真时才会出现错误,据我所知DispatchWorkItem不会一次取消所有任务,

我怎么解决这个问题?

0 投票
1 回答
699 浏览

swift - 有没有一种特定的方法可以将 DispatchWorkItems 附加到 DispatchQueue 而不是在代码中重新声明它们?

我有几个 Dispatch 工作项要在队列上执行,我不想重新声明代码,我想将它们传递给数组或列表,DispatchWorkItems然后将其注入调度队列有没有办法实现这一点?

/// 我是如何实现这样的目标的

// 这可能吗 ?