Apple утверждает, что NSMutableArray не является потокобезопасным. Однако, если вы добавляете объекты в один поток и копируете в другое, это не приведет к сбою. Если вы добавите объект из разных потоков, он сработает.
import Foundation
import XCPlayground
var array = NSMutableArray()
var queues = [NSOperationQueue]()
let syncQueue = NSOperationQueue()
syncQueue.maxConcurrentOperationCount = 1
for i in 0..<100 {
let queue = NSOperationQueue()
queue.maxConcurrentOperationCount = 1
queues.append(queue)
queue.addOperationWithBlock({
for j in 0..<100000 {
if j == 0 {
sleep(1)
} else {
usleep(j < 5 ? 100 : rand() % 10 == 0 ? 1 : 0)
}
if i % 2 == 0 {
syncQueue.addOperationWithBlock({
array.addObject(NSNumber(int: rand()))
})
} else {
var copy = array.copy()
}
}
})
}
XCPSetExecutionShouldContinueIndefinitely()
Однако, я не нашел в документации, где будет описано (что функция копирования поточно на NSMutableArray). Если кто-то предоставит ссылку, я буду признателен.
Так что это _can_ crash? – Frizlab
@Frizlab Это может привести к неожиданным результатам, которые * могут * включать сбой. –