Вызов `[[NSDocumentController sharedDocumentController] RecentDocumentURLs]` зависает

У меня есть приложение, которое регулярно вызывает [[NSDocumentController sharedDocumentController] recentDocumentURLs] для восстановления списка недавно открытых элементов. Некоторое время это работало хорошо, но недавно я получил отчет о том, что он зависает в системе пользователя:

11 -[NSDocumentController(NSPrivate) _recentDocumentURLsForKey:] + 271 (AppKit + 5903428) [0x7fff92ae5444] 1-11 11 -[__NSOperationInternal _waitUntilFinished:] + 131 (Foundation + 1060402) [0x7fff86a1ee32] 1-11 11 __psynch_cvwait + 10 (libsystem_kernel.dylib + 94046) [0x7fff8dec6f5e] 1-11 *11 psynch_cvcontinue + 0 (pthread + 30281) [0xffffff7f80e8d649] 1-11

Для пользователя, сообщившего об ошибке, это начало происходить после обновления до El Capitan — он регулярно загружает файлы из общих сетевых ресурсов, поэтому я предполагаю, что система блокирует вызов, пытаясь найти файлы. Оглядываясь вокруг, кажется, что проблема существует уже некоторое время: http://www.cocoabuilder.com/archive/cocoa/317137-thread-deadlock.html и http://ticket.macromates.com/show?ticket_id=F3058D68.

Проблема в том, что хотя несколько приложений сообщают, что проблема устранена, я не смог отследить фактическое исправление. Что было бы подходящим способом исправить это? Является ли выгрузка его в фоновый поток единственным подходящим решением, или я что-то упускаю?


person Melllvar    schedule 17.10.2015    source источник


Ответы (1)


FWIW, я обошел это, вызвав recentDocumentURLs в отдельном потоке при запуске приложения. Как только список доступен, я помещаю URL-адреса в NSMutableArray и с этого момента обновляю как NSDocumentController, так и NSMutableArray.

Чтобы воспроизвести поведение NSDocumentController с помощью массива (сохранить только уникальные URL-адреса), я удаляю все URL-адреса, соответствующие новому URL-адресу, а затем вставляю новый в позицию 0.

person Melllvar    schedule 14.11.2015