当我在主线程上并尝试 DispatchQueue.main.async 时,它不会使应用程序崩溃,但 DispatchQueue.main.sync 会崩溃。为什么这样?
我有一组调度工作项,如何等到一项工作完成后再继续队列中的下一项工作?
func AsyncCalls(statusHandler: @escaping (String) -> Void){
var dispatchWorkItems : [DispatchWorkItem] = []
let categoryWorkItem = DispatchWorkItem {
main {
return statusHandler("Loading categories ")
}
self.modelView.getCategories(completion: { data,error in
main {
if data.isEmpty {
return statusHandler("\(error )")
}else{
return statusHandler("Done loading categories")
}
}
})
}
let itemsWorkItem = DispatchWorkItem {
main {
return statusHandler("Loading Inventory ")
}
self.modelView.getInventory(completion: { data,error in
main {
if data.isEmpty {
return statusHandler("\(error )")
}else{
return statusHandler("Done loading Inventory")
}
}
})
}
dispatchWorkItems.append(categoryWorkItem) …Run Code Online (Sandbox Code Playgroud) dispatch grand-central-dispatch dispatch-async swift dispatch-queue
我\xe2\x80\x99m很好奇DispatchQueue到底是什么,我试图用谷歌搜索这些信息,但所有文档都相当抽象,并且不\xe2\x80\x99t提供有关实现的任何真实信息。在我的理解中,DispatchQueue是某种存在于某处的实体,能够存储代码块,并由内核直接控制(通过GCD,它被烘焙到内核中),它能够将这些块注入到所选中(通过GCD) /内核)线程。这是 DispatchQueue 的正确愿景,还是我误解了什么?
\n我使用 Firebase 上传带有进度指示器的文件:
RappleActivityIndicatorView.setProgress(CGFloat(a), textValue: "\(String(a * 100)) %")
print("\(a) %")
Run Code Online (Sandbox Code Playgroud)
我想实现一个条件:如果 % 的值(例如:23%)停留 15 秒或更长时间,则会取消上传。
我正在考虑一个 GCD 计时器:
DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
print("We can launch the cancellation of the upload")
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何链接 a 值在 15 秒内未更新的条件。任何想法 ?
多谢,
我有一系列必须按顺序执行的任务,因此它们被 DispatchQueue 聚集起来。为了通知用户他们正在忙碌,我启动了活动图标。但是如果脱离主线程我该如何停止呢?
从逻辑上讲,我想要实现的是:
override func viewDidLoad() {
super.viewDidLoad()
self.activityIcon.startAnimating()
DispatchQueue.main.async {
self.bigTask1()
}
DispatchQueue.main.async {
self.bigTask2()
self.activityIcon.stopAnimating()
}
}
Run Code Online (Sandbox Code Playgroud)
这显然会产生运行时错误:“UIActivityIndicatorView.stopAnimating()必须仅从主线程使用”。
将其放入stopAnimating()主队列中可以快速打开和关闭它,没有人会看到它。
像这样的队列外呼叫功能的批准方式是什么main?
非常感谢。PS我已经阅读过类似问题的答案,但不太明白。
我目前正在 Xcode 10 Playground (Swift 5) 中测试此代码:
func one() {
let test = "bla"
two(test, completion: { (returned) in
print(returned)
})
}
func two(_ test: String, completion: @escaping (_ returned: String?) -> Void) {
DispatchQueue.global(qos:.background).async {
if !test.isEmpty {
//Some slow stuff
DispatchQueue.main.async {
return completion("hi!")
}
}
//Also some slow stuff
DispatchQueue.main.async {
return completion(nil) //can't have this in "else"!
}
}
}
one()
Run Code Online (Sandbox Code Playgroud)
问题是“hi”和“nil”都被打印了。
如果我摆脱线程,它工作得很好,但有了它,它似乎在DispatchQueue.main.async第一个线程有机会返回之前到达第二个线程。
在我的实际代码中的“一些缓慢的东西”中还有很多事情发生,if但我不能依赖在调用第二次返回之前花费足够长的时间来返回。
如何实现这一点:让函数在后台线程中运行,但在主线程上仅返回一次(就像通常没有线程的代码一样)?
ios completionhandler swift ios-multithreading dispatch-queue
我想在目标 c 中使用以下代码。
var recordingQueue = DispatchQueue(label: "recordingQueue", qos: DispatchQoS.userInteractive)
Run Code Online (Sandbox Code Playgroud) 我正在使用手势识别开发ARKit/ VisioniOS应用程序.我的应用程序有一个包含单个的简单UI UIView.没有ARSCNView/ 根本没有ARSKView.我正在将一系列捕获ARFrames到CVPixelBuffer我用于的内容中VNRecognizedObjectObservation.
我不需要会话中的任何跟踪数据.我只需要currentFrame.capturedImage为CVPixelBuffer.我需要以30 fps捕获ARFrame.60 fps是过高的帧速率.
preferredFramesPerSecond在我的情况下,实例属性绝对没用,因为它控制渲染ARSCNView/的帧速率ARSKView.我没有ARViews.并且它不会影响会话的帧速率.
所以,我决定使用run()和pause()方法来降低会话的帧速率.
题
我想知道如何在指定的时间内自动run和pauseARSession?持续时间run和pause方法必须16 ms(或0.016秒).我想通过它可能是可能的DispatchQueue.但我不知道如何实现它.
怎么做?
这是一个伪代码:
session.run(configuration)
/* run lasts 16 ms */
session.pause()
/* pause lasts 16 ms */
session.run(session.configuration!)
/* etc... */
Run Code Online (Sandbox Code Playgroud)
PS 我在我的应用程序中既不使用CocoaPod也不使用Carthage.
更新:它是关于如何currentFrame.capturedImage检索和使用ARSession的.
let session …Run Code Online (Sandbox Code Playgroud)