问题标签 [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.
swift - 如何在 GCD 中停止 DispatchWorkItem?
我目前正在玩Grand Central Dispatch并发现了一个名为DispatchWorkItem
. 文档似乎有点不完整,所以我不确定是否以正确的方式使用它。我创建了以下代码段并期望有所不同。我预计该项目将在调用后被取消cancel
。但由于某种原因,迭代仍在继续。任何想法我做错了什么?代码对我来说似乎很好。
swift - 为什么 DispatchWorkItem 会通知崩溃?
我刚刚开始在 Swift 编程语言中学习更多关于 Grand Central Dispatch 的知识。
我按照在线教程更好地理解 GCD 并尝试了各种使用示例......
在有关工作项的部分中,我编写了以下代码:
该代码基本上在两个不同的队列(主队列和全局队列)中执行工作项,当工作项在两个队列中完成运行时,我得到了结果。
上面代码的输出是:20。
当我尝试稍微操作代码并将另一个队列添加到混合中并运行与qos
全局队列(.utility
)相同的相同工作项时,如下所示:
应用程序崩溃。
但是当我更改命令的顺序时,我将方法移动到workItem.notify
方法的开头,应用程序工作并给我正确的输出,即 25 :
任何人都可以帮助了解该.notify()
方法的实际工作原理吗?为什么命令的顺序有所不同?
非常感谢提前...
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 次总是有效。
- 发送数据到FB
- 显示活动指示器
- 回调到达所以取消errorTask,将其设置为nil,并关闭活动指示器
- 显示成功警报。
但每隔一段时间
- 这将需要更长的时间然后 15 秒
firebaseTask
被取消并设置为零,活动指示器将被关闭- 错误标签将显示
- 成功警报仍会出现
代码块关闭actiInd errorTask
,显示 errorLabel,取消firebaseTask
并设置它为 nil。一旦 firebaseTask 被取消并设置为 nil,我认为其中的所有内容也会停止,因为回调从未到达。 这可能是我困惑的原因。似乎即使firebaseTask
被取消并设置为零,someRef?.updateChildValues(...
它仍在运行,我也需要取消它。
我的代码:
ios - 如何在 Swift 中使这个 DispatchWorkItem 无效?
我正在制作一个计时器,它会在手机录制并使用过滤器进行一些繁重的工作时更新文本。由于某种原因,工作项似乎没有失效,因为当我回到我的视图时,我有一个额外的计时器来更新文本。每次我回去重新启动它时,这些都会堆积起来。
当我停止录制时,这个 DispatchWorkItem 不应该被扔掉吗?之后我什至试着让它为零。
我可能有的一个猜测是我需要创建一个全局 bool 以便我可以选择退出 for 循环,但我不知道为什么需要这样做。
编辑:我想我明白了,虽然我不知道它在技术上是否正确:
ios - 快速同步多个 Web 服务调用以串行顺序
我正在点击一个网络服务 url 10 次并得到响应。我正在使用Alamofire
和SwiftyJSON
。这是我的控制器代码
这是我的服务处理程序类代码
我正在发送一个带有 for 循环索引的计数器键,只是为了跟踪哪个索引返回的响应。但是响应不是按顺序排列的。我们可以在第 2 和第 1 响应之前期待第 3 响应。这是因为带有函数调用的 API 调用APIManager.apiGet
是异步的,并且正在转义,因此会继续 for 循环。
我也使用了 dispatchQueue
并将函数转换为:
与服务调用代码是异步的结果相同。如果我们使
那么我们也不会以串行顺序获得响应,因为异步和 dispatchQueue 中的网络调用假定任务已完成。
条件是只在不冻结 UI 的情况下以异步方式访问服务。如果我打的服务是同步的方式,那么我会得到我想要的结果。但是阻塞主线程是完全不能接受的。
我可以使用数组或一些全局布尔变量来管理这个东西,但我不想使用它们。有没有其他方法可以按调用它的顺序获得响应?任何帮助或提示表示赞赏。
ios - 如何防止在 GCD 中释放对象?
此功能应该重新安排工作项的执行:
它在开发中运行良好,但设计似乎很可疑,所以我问了一些基本问题:
- 可能
workItem
是 nil,如果workItem?.cancel()
在队列尝试执行workItem
? id
执行时inside可能workItem
是 nilworkItem
还是由 scoped 保留let id = self.id
?- 如果对象已被释放,
isDoing
内部workItem
是否已经被释放?换句话说,当对象被释放时,调度会发生什么?workItem
MyClass
workItem
MyClass
ios - 调用 .cancel() 时,DispatchWorkItem 未终止函数
我有一系列使用 Alamofire 在主函数中调用的函数列表中按顺序发出的 HTTP 请求runTask()
,我希望能够停止这些请求。因此,我为我需要运行的每个任务设置了runTask()
函数调用,并将工作项存储在一个数组中,如下所示:DispatchWorkItem
然后,我迭代工作项数组并调用perform()
函数,如下所示:
最后,我的应用程序中有一个按钮,我想在点击时取消工作项,我有以下代码来实现这一点:
workItem.isCancelled
打印到true
; 但是,我在被调用的函数中设置了日志,runTask()
即使workItem.cancel()
被调用和workItem.isCancelled
打印,我仍然看到函数正在执行true
。我做错了什么,如何停止执行我的功能?
kotlin - Kotlin 是否有与 swift 中的“DispatchWorkItem”完全相同的东西?
我想在超时或满足某些特定条件后执行特定功能。我在 swift usingDispatchWorkItem
和 used中做了同样的事情
启动计时器并在 10 秒后执行相关的 disptachWorkItem。
如何在 Kotlin 中做到这一点?
arrays - DispatchWorkItem 不会立即取消任务
我有一个讨厌的搜索问题。
有一个包含30000个对象和一个textView的结构数组,输入字母时,我删除空格并在searchText中设置文本,searchText有WillSet和DidSet,在WillSet中我取消所有旧文本的搜索任务并开始搜索新文本已设置。在search()
函数中,我遍历数组并向函数中的 DispatchWorkItem 添加逻辑,当我输入大量字符时anyTranslate()
,searchText 会出错。- [CFString length]: message sent to deallocated instance
我创建了一个test
不应该为真anyTranslate()
但有时打印为真的变量类型,只有当测试等于真时才会出现错误,据我所知DispatchWorkItem
不会一次取消所有任务,
我怎么解决这个问题?
swift - 有没有一种特定的方法可以将 DispatchWorkItems 附加到 DispatchQueue 而不是在代码中重新声明它们?
我有几个 Dispatch 工作项要在队列上执行,我不想重新声明代码,我想将它们传递给数组或列表,DispatchWorkItems
然后将其注入调度队列有没有办法实现这一点?
/// 我是如何实现这样的目标的
// 这可能吗 ?