Ответ 1
Я бы склонялся к dispatch_sync
вашей операции чтения с помощью my_queue
для обеспечения безопасности потоков (при условии, что это последовательная очередь). Вы также можете использовать любой из инструментов синхронизации (например, блокировки или директива @synchronized
), но при условии, что у вас уже настроена очередь для взаимодействия с файлами, используя что последовательная очередь, вероятно, самая простая.
Этот метод использования очереди для координации взаимодействия с общим ресурсом обсуждается в разделе Исключительный код блокировки в руководстве по программированию Concurrency.
Кстати, если вы сохраняете фоновую очередь (что означает, что операция сохранения, по-видимому, достаточно медленная, чтобы оправдывать ее в фоновом режиме), может быть разумно убедиться, что вы запросите немного времени для завершения операция в случае, если приложение, само, прервано (т.е. пользователь вводит кнопку физического дома, приходит вызов и т.д.), пока выполняется операция сохранения. Вы делаете это, вызывая beginBackgroundTaskWithExpirationHandler
перед отправкой операции сохранения и вызывая endBackgroundTask
, когда это будет сделано:
UIApplication *application = [UIApplication sharedApplication];
// get background task identifier before you dispatch the save operation to the background
UIBackgroundTaskIdentifier __block task = [application beginBackgroundTaskWithExpirationHandler:^{
if (task != UIBackgroundTaskInvalid) {
[application endBackgroundTask:task];
task = UIBackgroundTaskInvalid;
}
}];
// now dispatch the save operation
dispatch_async(my_queue, ^{
// do the save operation here
// now tell the OS that you're done
if (task != UIBackgroundTaskInvalid) {
[application endBackgroundTask:task];
task = UIBackgroundTaskInvalid;
}
});
Это обеспечит успешную завершение вашей операции сохранения, даже если приложение будет прервано.
И, как указывает Jsdodgers, вы, вероятно, захотите также выполнить запись атома.