【问题标题】:Unable to read disambiguation result in INAddTasksIntent无法读取 INAddTasksIntent 中的消歧结果
【发布时间】:2019-07-03 13:41:11
【问题描述】:

在我的应用中,用户可以通过 Sirikit 将任务添加到列表中(例如 Siri 意图查询:“在 MyApp 中添加到费用列表 100 美元的牛仔裤”)。如果建议的列表在应用程序中不可用,我要求消除歧义。

resolveTargetTaskList 中未捕获多选消歧的结果。

intent.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))  
    }  
}  

截图供参考:

请帮帮我。

【问题讨论】:

  • 截图的帮助可能不如一些调试输出那么大。你检查过title 和spokenPhrase 的值吗?附带说明一下,当使用 guard let title = ... 时,您无需稍后从 targetTaskList 中强制解包,只需直接使用 title。

标签: ios swift siri sirikit


【解决方案1】:

二读时我想我明白了:

您需要在completion(.success(with: taskLists[index])) 之后紧跟return,否则您仍将执行该函数的其余部分,其中包括一个递归调用。

一般来说,我建议您像这样修改您的函数:

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,流程更接近和更迅速的方式。当然,guard 语句的 else 稍长一些,但您始终可以将其重构为另一种方法。一般来说,它更像是“让我找到与输入匹配的第一个元素。如果找不到,请做一些后备,否则正常进行”。它还摆脱了使用索引对列表进行迭代。

【讨论】:

  • 即使我选择了一个选项,标题也没有改变。这就是它进入无限循环的原因。匹配始终为零。
  • 这只是意味着您的resolveTargetTaskList 方法得到的任何intent 都与您在getAllLists 方法中定义的完全不同。我给出了这个答案,因为您的原始代码无论如何都可能以无限循环结束,因为您从未阻止在 switch 语句中执行完成块(我假设 getAllLists 通常不会返回空数组)。无论如何,重复我的其他评论:你的实际值是多少?看看这个,可能是你的问题。
  • 正如 Pavel 在forums.developer.apple.com/message/369393#369393 中建议的那样,当我说选项时,意图获取所述列表名称。看起来像诗丽吉中的一个错误。感谢您的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多