标签: dispatch-queue

DispatchQueue.main.async 不会崩溃,但 DispatchQueue.main.sync 会崩溃?

当我在主线程上并尝试 DispatchQueue.main.async 时,它不会使应用程序崩溃,但 DispatchQueue.main.sync 会崩溃。为什么这样?

multithreading ios dispatch-queue

1
推荐指数
1
解决办法
755
查看次数

在继续处理下一个请求或调度队列中的下一个 DispatchWorkItem 之前,如何等待接收来自 DispatchWorkItem 的响应

我有一组调度工作项,如何等到一项工作完成后再继续队列中的下一项工作?

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

1
推荐指数
1
解决办法
2014
查看次数

DispatchQueues 的底层是如何实现的?

我\xe2\x80\x99m很好奇DispatchQueue到底是什么,我试图用谷歌搜索这些信息,但所有文档都相当抽象,并且不\xe2\x80\x99t提供有关实现的任何真实信息。在我的理解中,DispatchQueue是某种存在于某处的实体,能够存储代码块,并由内核直接控制(通过GCD,它被烘焙到内核中),它能够将这些块注入到所选中(通过GCD) /内核)线程。这是 DispatchQueue 的正确愿景,还是我误解了什么?

\n

macos grand-central-dispatch ios dispatch-queue

1
推荐指数
1
解决办法
278
查看次数

Swift - 具有 GCD 和条件的计时器

我使用 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 秒内未更新的条件。任何想法 ?

多谢,

timer grand-central-dispatch swift swift4 dispatch-queue

0
推荐指数
1
解决办法
1168
查看次数

Swift - stopAnimating() - 必须仅在主线程中使用

我有一系列必须按顺序执行的任务,因此它们被 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我已经阅读过类似问题的答案,但不太明白。

animation swift dispatch-queue

0
推荐指数
1
解决办法
770
查看次数

完成处理程序被调用两次(使用线程)

我目前正在 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

0
推荐指数
1
解决办法
3874
查看次数

如何在目标c中创建调度队列?

我想在目标 c 中使用以下代码。

var recordingQueue = DispatchQueue(label: "recordingQueue", qos: DispatchQoS.userInteractive)
Run Code Online (Sandbox Code Playgroud)

objective-c dispatch ios dispatch-queue

-2
推荐指数
1
解决办法
4580
查看次数

在指定的时间段内运行和暂停ARSession

我正在使用手势识别开发ARKit/ VisioniOS应用程序.我的应用程序有一个包含单个的简单UI UIView.没有ARSCNView/ 根本没有ARSKView.我正在将一系列捕获ARFramesCVPixelBuffer我用于的内容中VNRecognizedObjectObservation.

我不需要会话中的任何跟踪数据.我只需要currentFrame.capturedImageCVPixelBuffer.我需要以30 fps捕获ARFrame.60 fps是过高的帧速率.

preferredFramesPerSecond在我的情况下,实例属性绝对没用,因为它控制渲染ARSCNView/的帧速率ARSKView.我没有ARViews.并且它不会影响会话的帧速率.

所以,我决定使用run()pause()方法来降低会话的帧速率.

我想知道如何在指定的时间内自动runpauseARSession?持续时间runpause方法必须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)

augmented-reality ios swift arkit dispatch-queue

-6
推荐指数
1
解决办法
497
查看次数