Вызывается обработчик прерываний ServicesDaemonManager. -[Подключение FontServicesDaemonManager]_block_invoke

#xcode #memory-leaks #swiftui #ios14 #swiftui-14.3-defect

#xcode #утечки памяти #swiftui #ios14 #swiftui-14.3- дефект

Вопрос:

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

В любом случае перед сбоем я получаю черный экран и вижу эти ошибки.

Вызывается обработчик прерываний [ServicesDaemonManager]. -[Подключение FontServicesDaemonManager]_block_invoke

Ошибка при подключении к службе XPC: ошибка домена = NSCocoaErrorDomain Code= 4097 «подключение к службе с именем pid 0

Вот код:

  static func fetch(_ completion: @escaping(Result<[Contact], Error>) -> Void) {
        let containerID = CNContactStore().defaultContainerIdentifier
        let predicate = CNContact.predicateForContactsInContainer(withIdentifier: containerID())
        
        let keysToFetch = [
            CNContactImageDataKey,
            CNContactImageDataAvailableKey,
            CNContactThumbnailImageDataKey,
            CNContactGivenNameKey,
            CNContactFamilyNameKey,
            CNContactPhoneNumbersKey,
            CNContactEmailAddressesKey
        ] as [CNKeyDescriptor]
        
        do {
            let contacts = try CNContactStore().unifiedContacts(matching: predicate, keysToFetch: keysToFetch)
            completion(.success(contacts.map({ .init(contact: $0)})))
        } catch {
            completion(.failure(error))
        }
    }
 

Я специально зависаю на линии

 let contacts = try CNContactStore().unifiedContacts(matching: predicate, keysToFetch: keysToFetch)
 

с unifiedContacts одним подчеркнутым как проблема. Теперь я даже не могу нажать на вкладку. Это либо полностью завершает работу Xcode, либо моего приложения.

Обновить

Итак, строка:

 let contacts = try CNContactStore().unifiedContacts(matching: predicate, keysToFetch: keysToFetch)
 

происходит сбой, но только когда я использую этот предикат

 .predicateForContactsInContainer(withIdentifier: containerID())
 

Существуют различные предикаты, которые я могу использовать для ограничения выборки, например class func predicateForContacts(matchingName name: String) -> NSPredicate .

Я полагаю, что проблема в том, что я извлекаю все контакты одновременно. Да, я делаю это в фоновом потоке, но, похоже, мое приложение не может обрабатывать одновременную выборку всех моих контактов так, как я это делаю.

НЕРАЗРЕШЕННЫЙ

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

введите описание изображения здесь

Конечно, трассировка стека отсутствует. Возможно, потребуется переархивировать приложение.

Комментарии:

1. Отлично работает с Xcode 12.1 / iOS 14.1. Какую среду вы использовали?

2. @Asperi Xcode 12.3 / iOS 14.3