简体   繁体   English

为什么在进行本地搜索时会出现MKErrorDomain错误?

[英]Why do I get an MKErrorDomain error when doing a local search?

I am trying to implement a search bar where the user can type in a string and search for an address or a business. 我正在尝试实现一个搜索栏,用户可以在其中键入字符串并搜索地址或业务。

To find businesses I use Yelp APIs to outsource the information I need. 为了找到企业,我使用Yelp API来外包我需要的信息。

To find addresses I use Apple's MKLocalSearch APIs to get the information I need. 要查找地址,我使用Apple的MKLocalSearch API来获取我需要的信息。

However, I do have a problem. 但是,我确实遇到了问题。 When I hold on to the backspace button to clear out the text from the search bar or type too fast into the search bar I get an MKErrorDomain error: 当我按住退格按钮以清除搜索栏中的文本或在搜索栏中输入太快时,我收到MKErrorDomain错误:

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

When I get this error I will have to wait a few moments in order for the code to work again and retrieve information from the APIs. 当我收到此错误时,我将不得不等待片刻,以便代码再次工作并从API检索信息。

The following code is what I have to implement what I am looking for: 以下代码是我必须实现我正在寻找的东西:

This is the search bar delegate method: 这是搜索栏委托方法:

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
    }

}

I use MKLocalSearchCompleter to get suggestions based on what the user types into the search bar: 我使用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)
    }


}

In the code above I use NSDataDetector to see if the suggested text is an address...If so I feed it into MKLocalSearch ... 在上面的代码中,我使用NSDataDetector来查看建议的文本是否是一个地址......如果是这样,我将它提供给MKLocalSearch ...

Finally, In order to search for for addresses I defined a method called searchAddress(for:) : 最后,为了搜索地址,我定义了一个名为searchAddress(for:)的方法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))
        })
    }

When I type too fast or hold on the backspace key I get the following error in the console: 当我键入太快或按住退格键时,我在控制台中收到以下错误:

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

Any help will be much appreciated :-) 任何帮助都感激不尽 :-)

What you're seeing here is the MKError.loadingThrottled error. 你在这里看到的是MKError.loadingThrottled错误。 You will have to delay requests you're sending to Apple. 您将不得不延迟发送给Apple的请求。

You can do this by restarting a timer every time the user updates the search query. 您可以通过每次用户更新搜索查询时重新启动计时器来执行此操作。 You can adjust how frequently you ping the API by extending the length of the timer. 您可以通过延长计时器的长度来调整ping API的频率。 By resetting the timer each time the query is updated, you avoid sending multiple requests when the characters are changing rapidly. 通过在每次更新查询时重置计时器,可以避免在字符快速更改时发送多个请求。

// 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 为什么在尝试使用presentViewController时出现此错误? - Why do I get this error when trying to use presentViewController? 为什么我在尝试移动鼠标时会出错? - Why do I get an error when trying to move the mouse? 尝试检查是否在Corona SDK中时为什么会出现此错误? - Why do i get this error when trying to check if in Corona sdk? 在Swift中以编程方式声明约束时,为什么会出现错误? - Why do I get an error when declaring a constraint programmatically in Swift? 为什么我得到错误“没有为参数'certificateIds'提供任何值。”当我在xcode中更新时 - Why do I get the error “No value was provided for the parameter 'certificateIds'.” when I hit renew in xcode 在应用商店上发布应用时,为什么会出现代码签名错误? - Why do I get a code sign error when I publish my app on app store? Transit MKDirectionsRequest产生空错误Error Domain = MKErrorDomain Code = 5“(null)” - Transit MKDirectionsRequest produces null error Error Domain=MKErrorDomain Code=5 “(null)” 为什么在尝试编译此代码时会出现错误“error:unknown type name'virtual'”? - Why do I get the error “error: unknown type name 'virtual'” when trying to compile this code? 为什么此委托代码出现错误? - Why do I get an error for this delegate code? 当我为自己分配UITextField委托时,为什么会出现错误? - Why do I get an error when I assign a UITextField Delegate to itself?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM