我想知道用GCD在iOS上使用自己的队列/线程的主要规则是什么。
全球气候变化理事会向我们提供:
DispatchQueue.global()在后台执行代码。还可以使用以下方法创建自己的队列:
DispatchQueue(label: "my own queue")这里有什么更好的方法或建议?使用GCD中的global()队列还是创建我自己的队列?
举个例子:我想用Network.Framework做一些网络内容。
下面是示例1:
let connection = NWConnection(host: "1.2.3.4", port: 40000, using: .udp)
let queue = DispatchQueue(label: "network queue")
connection.start(queue: queue)下面是示例2:
let connection = NWConnection(host: "1.2.3.4", port: 40000, using: .udp)
let queue = DispatchQueue.global()
connection.start(queue: queue)你怎么看?example1 vs example2
发布于 2020-07-29 10:35:33
这个DispatchQueue.global()是一个并发队列,意味着提交给返回队列的任务是并行调度的。
当这个DispatchQueue(label: "network queue")是一个串行队列任务提交的时候,一个接一个地运行
当your取决于您的情况时,在框架/库中通常使用创建队列的选项,以便将它们的工作与代码分开,如果您发现在使用中超过了队列,然后创建一个新的队列,那么拥有一个就绪的全局队列是非常方便的。
您的示例可以解释为,如果在每次连接更改时调用的方法中都有这种情况。
print("1")
print("2")
print("3")有了global,你就能得到
print("1")
print("3")
print("2")
print("3")
print("1")
print("2")同时创建队列
print("1")
print("2")
print("3")
print("1")
print("2")
print("3")发布于 2020-08-05 23:39:59
tl;dr
您可能希望为这个示例创建一个自定义的串行队列。您可能会喜欢这个很好的描述性名称,它简化了调试。您可能希望在这个队列上进行串行行为,这样可以更容易地对逻辑进行推理,并避免引入额外的线程安全问题。
关于你的一般性问题:
使用GCD中的全局()队列,还是创建自己的队列?
可能要求您选择自定义队列而不是全局队列的几个注意事项:
。
尽管如此,我还是使用全局队列来执行简单、短、一次性的任务.为了获得更好的调试体验,我倾向于为运行时间较长的任务或与我的应用程序中的特定逻辑子系统相关联的任务使用名称良好的自定义队列。
https://stackoverflow.com/questions/63151215
复制相似问题