我想将给定的块添加到数组中,然后在请求时运行数组中包含的所有块.我有类似这样的代码:
class MyArrayBlockClass {
private var blocksArray: Array<() -> Void> = Array()
private let blocksQueue: NSOperationQueue()
func addBlockToArray(block: () -> Void) {
self.blocksArray.append(block)
}
func runBlocksInArray() {
for block in self.blocksArray {
let operation = NSBlockOperation(block: block)
self.blocksQueue.addOperation(operation)
}
self.blocksQueue.removeAll(keepCapacity: false)
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于可以跨多个线程调用addBlockToArray.发生的事情是addBlockToArray在不同的线程中快速连续调用,并且只附加其中一个项目,因此在runBlocksInArray期间不会调用另一个项目.
我尝试过这样的东西,但似乎不起作用:
private let blocksDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
func addBlockToArray(block: () -> Void) {
dispatch_async(blocksDispatchQueue) {
self.blocksArray.append(block)
}
}
Run Code Online (Sandbox Code Playgroud) arrays multithreading read-write grand-central-dispatch swift
我看到一些使用gcd的方法,但有些方法可能会这样做:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(queue, ^{
dispatch_sync(dispatch_get_main_queue(), ^{
});
});
Run Code Online (Sandbox Code Playgroud)
但其他人可能会这样做:
imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL);
dispatch_async(imageQueue_, ^{
dispatch_async(dispatch_get_main_queue(), ^{
});
});
Run Code Online (Sandbox Code Playgroud)
有什么区别?如果我想从网上下载很多图片,哪个更好?