Не удалось прочитать результат устранения неоднозначности в INAddTasksIntent

В моем приложении пользователи могут добавлять задачи в списки через Sirikit (пример запроса намерения Siri: «В MyApp добавьте в список расходов 100 долларов на джинсы»). если предлагаемый список недоступен в приложении, я прошу устранения неоднозначности.

результат множественного выбора в устранении неоднозначности не фиксируется в resolveTargetTaskList.

намерение.targetTaskList?.title — это значение, которое я передал с первой попытки. в результате он входит в бесконечный цикл.

func resolveTargetTaskList(for intent: INAddTasksIntent, with completion: @escaping (INTaskListResolutionResult) -> Void) {  
    guard let title = intent.targetTaskList?.title else {  
        completion(.needsValue())  
        print("no title value")              
    }  
    completeResolveTaskList(listName: intent.targetTaskList!.title, with: completion)  
}  



public func completeResolveTaskList(listName: INSpeakableString, with completion: @escaping (INTaskListResolutionResult) -> Void) {  
    print("completeResolveTaskList")  
    let allLists = getAllLists()  
    for index in 0...(allLists.count - 1) {  
        if allLists[index].spokenPhrase.lowercased() == listName.spokenPhrase.lowercased() {  
            completion(.success(with: taskLists[index]))  
        }  
    }  

    switch allLists.count {  
    case 0:  
        completion(.unsupported())  
    default:  
        completion(.disambiguation(with: taskLists))  
    }  
}  

скриншот для справки:

скриншот

Помогите мне, пожалуйста.


person rajeswari ratala    schedule 03.07.2019    source источник
comment
Скриншоты не так помогают, как, вероятно, некоторые отладочные данные. Вы проверили, какие значения имеют title и spokenPhrase? В качестве примечания: при использовании guard let title = ... вам не нужно позже принудительно распаковывать его из targetTaskList, просто используйте title напрямую.   -  person Gero    schedule 09.07.2019


Ответы (1)


При втором чтении я думаю, что вижу это:

Вам нужно return сразу после completion(.success(with: taskLists[index])), иначе вы все равно будете выполнять остальную часть функции, включая рекурсивный вызов.

В общем, я бы посоветовал изменить вашу функцию следующим образом:

public func completeResolveTaskList(listName: INSpeakableString, with completion: @escaping (INTaskListResolutionResult) -> Void) {  
    print("completeResolveTaskList")  
    let allLists = getAllLists()
    guard let matching = allLists.first(where: { $0.spokenPhrase.lowercased() == listName.spokenPhrase.lowercased() }) else {
        switch allLists.count {  
        case 0:  
            completion(.unsupported())  
        default:  
            completion(.disambiguation(with: taskLists))  
        }
        return
    }

    completion(.success(with: matching))  
}

Это соответствует, imo, потоку немного ближе и быстрее. Конечно, else для оператора guard немного длиннее, но вы всегда можете преобразовать его в другой метод. В общем, это больше похоже на «дайте мне первый элемент, который соответствует входным данным. Если вы не найдете ни одного, сделайте какой-нибудь запасной вариант, в противном случае продолжайте нормально». Это также избавляет от итерации по списку с индексом.

person Gero    schedule 09.07.2019
comment
Название не меняется даже после выбора опции. Вот почему он входит в бесконечный цикл. соответствие всегда равно нулю. - person rajeswari ratala; 09.07.2019
comment
Это просто означает, что все, что intent получает ваш метод resolveTargetTaskList, полностью отличается от того, что вы определили в своем методе getAllLists. Я дал этот ответ, потому что ваш исходный код, вероятно, в любом случае закончился бы бесконечным циклом, поскольку вы никогда не предотвращали выполнение блока завершения в операторе switch (и я предполагаю, что getAllLists обычно не возвращает пустой массив). В любом случае, повторю мой другой комментарий: Каковы ваши фактические значения? Посмотрите на это, скорее всего, это ваша проблема. - person Gero; 11.07.2019
comment
Как предложил Павел на forums.developer.apple.com/message/369393#369393 когда я произношу вариант, намерение получает указанное имя списка. похоже на баг в сириките. Спасибо за ваш ответ - person rajeswari ratala; 11.07.2019