Существует два типа очередей отправки.
Последовательная очередь (как и основная очередь) выполняет закрытые очереди «по порядку», которые вы ставите в очередь, по одной за раз.
Однако параллельная очередь (например, глобальная очередь отправки) выполняет одновременные замыкания. (Взгляните на документацию Apple )
В тех случаях, когда один и тот же номер счетчика печатается дважды, 309-е замыкание NSLogged счетчик до 308-го замыкания добавляет 1 к счетчику. (Ты понял?)
Так что для операции записи в файл вы должны использовать serial queue
, как показано ниже, как указано в документации
Последовательные очереди часто используются для синхронизации доступа к определенному ресурсу.
dispatch_queue_t serialQueue = dispatch_queue_create("com.myqueue.filewrite", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
NSLog(@"counterForAsync=%d",counterForAsync);
++counterForAsync;
if (file) {
[file seekToEndOfFile];
}
[file writeData:data];
});
К вашему сведению, это называется синхронизация . Вы должны synchronize
свой код, чтобы ваш critical section
(например, добавление счетчика или запись в файл) не был доступен более чем двум потокам одновременно.