相关疑难解决方法(0)

在多个线程中向Swift阵列添加项目导致问题(因为数组不是线程安全的) - 我该如何解决这个问题?

我想将给定的块添加到数组中,然后在请求时运行数组中包含的所有块.我有类似这样的代码:

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

16
推荐指数
2
解决办法
1万
查看次数

全局队列和用户队列之间有什么区别?

可能重复:
dispatch_get_global_queue和dispatch_queue_create有什么区别?

我看到一些使用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)

有什么区别?如果我想从网上下载很多图片,哪个更好?

grand-central-dispatch ios

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