ios - 在数组中异步添加数据

标签 ios grand-central-dispatch semaphore nsoperationqueue

我有 8 个单独的函数,它们都返回一个数据,我需要将数据存储在一个数组中。将数据存储到数组中并通知该数组已存储所有数据的最佳方法是什么。这样我就可以将它传递给另一个 View Controller 。例如,我有 f1()、f2()... 并且都返回一个字符串,我想将它存储在一个 dataArray 中。如果所有功能都在那里完成,我必须将此数据传递给另一个 vc。

最佳答案

您想要的工具是一个调度组和一个串行调度队列来收集结果。序列化更新结果很重要,因为修改数组不是线程安全的。当然,您可以将所有这些包装成一个通用的解决方案。作为一个没有经过大量测试的快速示例(并且有点奇怪,因为它是自我保留的,所以可能会令人困惑),但演示了基本方法:

class Dispatcher<Element> {
    let resultsQueue = DispatchQueue(label: "dispatcher") // Default is serial
    var results: [Element] = []
    init(functions: [() -> Element], completion: @escaping ([Element]) -> Void) {

        let group = DispatchGroup()
        let queue = DispatchQueue.global()
        for f in functions {
            queue.async(group: group) {
                let result = f()
                self.resultsQueue.sync { self.results.append(result) }
            }
        }

        // Just picking main here as a random place to perform the update.
        // You could also pass it in.
        group.notify(queue: DispatchQueue.main) { completion(self.results) }
    }
}

Dispatcher(functions: [{ return 1 }, { return 2 }], completion: { print($0) })

I have to pass this data to another vc



请注意,这强烈表明您正在做一些不正确的事情。 View Controller 不应该计算数据,也不应该将数据异步传递给其他 View Controller 。 View Controller 负责显示数据,并且在它们离开屏幕时可以自由销毁(并且第二个 View Controller 可能不在屏幕上,甚至在完成 block 运行时不存在)。工作应该转移到模型类, View Controller 应该观察模型并更新自己,然后模型完成它的工作。但是这个 Dispatcher 类仍然可以对此有所帮助。

关于ios - 在数组中异步添加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39227422/

相关文章:

iOS日期格式转换?

ios - IOS 11-空中发布

ios - void _UIPerformResizeOfTextViewForTextContainer 断言失败

ios - 如何在 objective-c 中为我的一系列任务创建队列

swift - 一次多次调用 DispatchSemaphore 的 wait() 是否安全?

API 响应关闭中的 iOS Swift 3 DispatchQueue.main.async()

java - 如何中断 Java Semaphore.tryAcquire 函数

ios - UITableView 数据源必须从 tableView : cellForRowAtIndexPath 返回一个单元格

php - 一段时间后信号量键丢失

Java用持久化存储实现锁定机制