Ваша первая проблема вызвана большим количеством запросов, порожденных при вводе условий поиска, потому что для каждого введенного или удаленного символа создается и запускается новый MKLocalSearch.Чтобы убедиться в этом, я положил что-то вроде вашего кода на игровую площадку и протестировал:
import PlaygroundSupport
import UIKit
import MapKit
PlaygroundPage.current.needsIndefiniteExecution = true
var searches = [MKLocalSearch]()
for i in 1...100 {
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = "Via roma n. \(i), Roma"
let search = MKLocalSearch(request: request)
search.start { (response, error) in
guard error == nil else {
print("request \(i) finished with error \(error!.localizedDescription)")
return
}
guard let _ = response else {
print("request \(i) finished with no response")
return
}
print("request \(i) completed successfully!")
}
searches.append(search)
}
. Вы увидите, что некоторые запросы выполнены без ошибок, а для некоторых запросов вы получите
The operation couldn’t be completed. (MKErrorDomain error 3.)
Что является MKErrorLoadingThrottled.Эта ошибка, согласно Apple dev , возникает, когда
Данные не были загружены, поскольку действует регулирование данных.Эта ошибка может возникать, если приложение часто запрашивает данные в течение короткого периода времени.
Более того, согласно Apple dev :
Тамнет ограничений по запросу для приложения или идентификатора разработчика, поэтому хорошо написанные приложения, которые работают правильно, не должны испытывать никаких проблем.Однако регулирование может происходить в плохо написанном приложении, которое создает чрезвычайно большое количество запросов.
Таким образом, в конечном итоге решением вашей проблемы может быть отсрочка запуска поискового запроса до тех пор, пока пользователь не получитзакончил печатать (вы можете использовать таймер, который срабатывает, когда пользователь не нажимал какую-либо клавишу на клавиатуре в течение определенного времени.)
PS: ОЧЕНЬ ВАЖНО не забудьте отменить предыдущий запрос, прежде чем начинать новый,в противном случае вы получите непредсказуемое поведение