2015-04-16 1 views
9

Я настраиваю NSFileCoordinator и NSFilePresenter в своем приложении, поэтому я могу сделать файл IO из приложения AppleWatch безопасным. В моем коде есть несколько мест, где я пишу в файл пару раз подряд. Это проблема сама по себе, и я работаю над ее исправлением, но я замечаю какое-то странное поведение в этом процессе.Задержка с NSFileCoordinator coordWritingItemAtURL

я обернуть мои пишет так:

//In a class that implements NSFilePresenter: 
NSFileCoordinator *coord = [[NSFileCoordinator alloc]initWithFilePresenter:self]; 
[coord coordinateWritingItemAtURL:self.presentedItemUrl options:0 error:nil byAccessor:^(NSURL *url) 
{ 
    //do my writing here using CFWriteStreamRef or NSOutputStream 
}]; 

На первой записи, блок записи происходит в течение 1 мс. Но после этого, существует около 0,5 секундной задержки между вызовом coordinateWritingItemAtURL и исполняемым блоком записи.

Ожидается ли такое поведение?

Some of the documentation для NSFileCoordinator и NSFilePresenter говорит использовать prepareForReadingItemsAtURLs:writingItemsAtURLs:options:error:byAccessor: для пакетных операций, но это кажется странным, чтобы получить такую ​​длительную задержку, когда я не партий.

Обновление: Это происходит и при чтении.

Обновление 2:Here - пример проекта, воспроизводящий проблему.

Update 3: Используя этот API взаимодействия между приложением и его расширение для apparently является badidea. Но вопрос все еще стоит.

+0

Где вы называете координаты? ... от. Расширение часов, родительское приложение через openParentApplication, где-то еще ...? –

+0

@MattG в родительском приложении. –

+0

Передайте действительный объект NSError в поле ошибки, чтобы узнать, есть ли у вас какая-либо ошибка при первой записи (возможно, именно поэтому она немедленно возвращается). Помимо этого, как правило, блоки не выполняются сразу, их поведение является асинхронным и может выполняться позднее в цикле выполнения. – resurrecteds

ответ

4

Ссылаясь на File System Programming Guide, вы можете прочитать следующее:

вы можете избежать включения изменений непосредственно из вашего файла метода ведущий. Вместо этого отправьте блок асинхронно в очередь отправки и обработайте изменения позже. Это позволяет обрабатывать изменения при удобстве вашего приложения, не вызывая ненужные задержки координатору файла, который инициировал изменение. Конечно, при сохранении или отказе от контроля файла (например, в в relinquishPresentedItemToReader:, relinquishPresentedItemToWriter: или savePresentedItemChangesWithCompletionHandler: методы) вы должны выполнить все необходимые действия немедленно и не defer их.

Я думаю, что это ваш случай, когда вы defering действия.

Возможное решение:

Пожалуйста, ознакомьтесь с this хорошо, правильно обрабатывать несколько последовательных операций письма, то relinquishPresentedItemToWriter, может сделать эту работу, то же самое будет работать с чтением файла, relinquishPresentedItemToReader, предположив что несколько разных объектов пытаются читать и записывать один и тот же файл.

PS:

Я не знаю, что ваше приложение делает точно, но я надеюсь, что вы прочитали это:

Если вы реализуете приложение документа на основе, вам не нужно включают семантику презентатора файла в подклассы NSDocument. Класс NSDocument уже соответствует протоколу NSFilePresenter и реализует соответствующие методы. Таким образом, все ваши документы автоматически регистрируются в качестве презентаторов соответствующего файла и выполняют такие действия, как сохранение изменений и изменение дорожки в документе .

+0

Я не использую NSDocument. Работа ввода-вывода завершается методами 'coord ... ...' CFReadStreamRef' и 'CFWriteStreamRef'. И я ничего не делаю дорого, когда отказываюсь от других читателей/писателей. Задержка, похоже, будет потрачена на то, чтобы получить любые блокировки, используемые для координации между процессами. –

+0

См. Мое обновление, добавив пример проекта. –

+0

@ Mr.Jefferson Есть ли другие объекты, пытающиеся разобраться с вашим файлом при написании? – ProllyGeek

 Смежные вопросы

  • Нет связанных вопросов^_^