Swift 4:创建一个异步串行队列,每个作业后等待2秒

迅速地

难以想象这个...

我想我需要2个线程,并且不确定如何实现它们。

完成后,每个网络检索请求之间至少要有2秒的延迟。

主线程:

按下UIButton->函数将网络检索请求添加到串行队列-> UILoop继续...

网络线程:

检查队列中的下一个请求->开始请求->完成请求->等待2秒->检查队列中的下一个请求->开始请求->完成请求->等待2秒->检查队列对于下一个请求->没有请求->检查队列是否有下一个请求...或Ends循环直到被调用。

var networkQueue = [NetworkRequest]()
var networkQueueActive = false

@IBAction func buttonPressed(_ sender: UIButton) {
    networkQueue.append(NetworkRequest(UIButton))
    if networkQueueActive == false {
        networkRetrieveFromQueue() // need to asynchronously call this DON'T KNOW HOW TO DO THIS
    }
}

func networkRetrieveFromQueue() {
    networkQueueActive = true
    while !networkQueue.isEmpty {
        let request = networkQueue.remove(at: 0)
        // synchronous network data retrieval on this thread KNOW HOW TO DO THIS
        // do something with the data retrieved KNOW HOW TO DO THIS
        // wait 2 seconds DON'T KNOW HOW TO DO THIS
    }
    networkQueueActive = false
}

如果你有

var networkQueue = [NetworkRequest]()
var networkQueueActive = false

然后,您networkRetrieveFromQueue应该:

  • 检查队列是否为空;
  • 如果不是,则获取队列中的第一项;
  • 发起异步请求;
  • 在该异步请求的完成处理程序中,networkRetrieveFromQueue2秒后再次调用

从而

func startQueue() {
    if networkQueueActive { return }

    networkQueueActive = true
    processNext()
}

// if queue not empty, grab first item, perform request, and call itself
// 2 seconds after prior one finishes

func processNext() {
    if networkQueue.isEmpty {
        networkQueueActive = false
        return
    }

    let request = networkQueue.removeFirst()

    get(request: request) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.processNext()
        }
    }
}

您的“流程请求”可能如下所示:

// perform asynchronous network request, with completion handler that is 
// called when its done

func get(request: NetworkRequest, completionHandler: @escaping () -> Void) {
    let task = URLSession.shared.dataTask(with: request.request) { data, _, error in
        guard let data = data, error == nil else {
            print(error ?? "Unknown error")
            completionHandler()
            return
        }

        // process successful response here

        // when done, call completion handler

        completionHandler()
    }
    task.resume()
}

现在,我不知道您的NetworkRequest模样,但这说明了如何在某些异步方法的完成处理程序中递归调用函数的基本思想。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Swift:依次处理多个异步请求。如何等待上一个请求完成?

在Swift中加载其他元素后,在TableViewCell中异步加载一个元素

Swift:创建一个可选的 IBOutlet

Swift:创建一个UIImage数组

在循环中一次执行一个异步方法,Swift 4

Swift 异步 HTTP 请求会创建另一个线程吗?

在 Swift 中创建线程安全读取时,为什么在并发队列之外创建了一个变量?

Swift:如何创建字典数组,每个字典中都包含一个数组?

UITextView中的每个数字只允许一个小数(Swift 4)

注册 firebase 和 swift 后,为 UID 创建一个数据库条目

for循环中的Swift异步/等待

创建一个在Swift中创建HTTPRequest的类

swift:比较 2 个字符数组,从每个数组中删除一个值

Swift通过在每个索引处获取max()从两个int数组中创建一个Int数组

在Swift中创建GCD队列?

合并图像和文本,在 swift 4 中创建另一个图像

在 Swift 4 中创建一个简单的倒计时

不到一秒的延迟,Swift 2

Swift使用委托创建一个类

Swift 遍历字典数组并创建一个新字典

在Swift中创建一个“ forCount”控件结构

如何在Swift中创建一个空数组?

在 Swift 中创建一个基于超时的函数

如何在Swift中创建一个指针?

如何在Swift中创建一个类数组

Swift-创建一个类数组

如何在 Swift 5 中创建一个变量?

Swift:创建一个对数组进行洗牌的按钮

专门为 VC 函数创建一个 swift 文件