为啥在进行本地搜索时会收到 MKErrorDomain 错误?

Posted

技术标签:

【中文标题】为啥在进行本地搜索时会收到 MKErrorDomain 错误?【英文标题】:Why do I get an MKErrorDomain error when doing a local search?为什么在进行本地搜索时会收到 MKErrorDomain 错误? 【发布时间】:2017-12-07 06:32:59 【问题描述】:

我正在尝试实现一个搜索栏,用户可以在其中输入字符串并搜索地址或公司。

为了寻找企业,我使用 Yelp API 来外包我需要的信息。

为了查找地址,我使用 Apple 的 MKLocalSearch API 来获取我需要的信息。

但是,我确实有一个问题。当我按住退格按钮从搜索栏中清除文本或在搜索栏中输入太快时,我收到 MKErrorDomain 错误:

The operation couldn’t be completed. (MKErrorDomain error 3.)

当我收到此错误时,我将不得不等待片刻,以便代码再次运行并从 API 检索信息。

以下代码是我必须实现我正在寻找的:

这是搜索栏委托方法:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 

    if searchBar.text == "" 
        addServiceCellToTableView()
        loadSearchHistory()
        return
     else if searchBar.text != "" 
        removeServiceCellFromTableView()
    


    if searchCompleter.isSearching
        searchCompleter.cancel()
        searchCompleter.region = (delegate?.businessSearchResultTableViewControllerNeedsUpdatedMapRegion(self))!
        searchCompleter.queryFragment = searchText
     else 
        searchCompleter.region = (delegate?.businessSearchResultTableViewControllerNeedsUpdatedMapRegion(self))!
        searchCompleter.queryFragment = searchText
    


我使用MKLocalSearchCompleter 根据用户在搜索栏中输入的内容获取建议:

func completerDidUpdateResults(_ completer: MKLocalSearchCompleter)

    guard completer.results.count != 0 else return

    var searchTerm: String = completer.results.first!.title
    if completer.results.first!.subtitle != "" 
        searchTerm = searchTerm + ", " + completer.results.first!.subtitle
    


    if let _ = addressDetector.firstMatch(in: searchTerm, options: [], range: NSMakeRange(0, searchTerm.utf8.count))
        searchAddress(for: searchTerm)
     else 
        getBusinesses(withSearchTerm: searchTerm, userCoordinates: currentUserLocation.coordinate)
    



在上面的代码中,我使用NSDataDetector 来查看建议的文本是否是地址...如果是,我将其输入MKLocalSearch...

最后,为了搜索地址,我定义了一个名为searchAddress(for:)的方法:

func searchAddress(for string: String)

        let localSearchRequest = MKLocalSearchRequest()
        localSearchRequest.naturalLanguageQuery = string
        localSearchRequest.region = (delegate?.businessSearchResultTableViewControllerNeedsUpdatedMapRegion(self))!

        let localSearch = MKLocalSearch(request: localSearchRequest)
        localSearch.start(completionHandler: searchResponse, error in
            guard error == nil else 
                print(error.debugDescription)
                return
            

            guard let mapItems = searchResponse?.mapItems else return

            self.tableViewDataSourceList = mapItems
            self.tableView.reloadData()
            self.delegate?.businessSearchResultTableViewStopedGettingBusiness(self, with: self.tableViewDataSourceList, at: CLLocationCoordinate2D(latitude: self.currentUserLocation.coordinate.latitude, longitude: self.currentUserLocation.coordinate.longitude))
        )
    

当我输入太快或按住退格键时,我在控制台中收到以下错误:

The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)

任何帮助将不胜感激:-)

【问题讨论】:

如果你向 MKLocalSearchCompleter 发送空字符串,它总是会返回一个错误 【参考方案1】:

您在这里看到的是MKError.loadingThrottled 错误。您将不得不延迟发送给 Apple 的请求。

您可以通过在每次用户更新搜索查询时重新启动计时器来实现此目的。您可以通过延长计时器的长度来调整 ping API 的频率。通过在每次更新查询时重置计时器,您可以避免在字符快速变化时发送多个请求。

// declare and store Timer somewhere

func searchAddress(with query: String) 



func timerDidFire(_ sender: Any) 
    let query = textField.text
    searchAddress(with: query)


Timer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(timerDidFire), userInfo: nil, repeats: false)

【讨论】:

你有一些我可以看的示例代码或你可以指点我的教程吗? @A.Jam 这样的东西可以工作***.com/a/38987761/4080860 所以我不确定一件事:您是否建议将搜索栏委托中的所有代码移动到您刚刚向我展示的示例中的 searchTime 选择器方法中? 添加了一个小例子,这对你来说清楚了吗? (有一些语法错误) 非常感谢,这正是问题的根源。

以上是关于为啥在进行本地搜索时会收到 MKErrorDomain 错误?的主要内容,如果未能解决你的问题,请参考以下文章

Scikit-learn GridSearchCV - 为啥我在执行 grid.fit() 时会收到数据类型错误?

为啥我在停止 MediaRecorder 时会收到 IllegalStateException?

为啥我在使用 foreach 时会收到 ***Error?

为啥我在使用 img 标签时会收到 403 禁止?

为啥我在尝试使用 HttpListener 时会收到“AccessDenied”? [复制]

为啥我在函数内部调用时会收到“错误:无效的挂钩调用”?