У меня есть класс, который выполнит поиск. После завершения я хочу, чтобы класс поиска передавал результаты, к которым когда-либо выполнял поиск экземпляр (другого класса). Мое мышление состояло в том, чтобы передать ссылку на класс, который создает экземпляр класса поиска и использует эту ссылку для вызова функции. Вот основной пример того, что я пытаюсь сделать. Как я могу заставить это работать, или есть другой/лучший способ?Swift - передать ссылку на класс
Поиск Класс (Я пробовал AnyObject и UITableViewContoller):
class SearchClass : NSObject, NSURLConnectionDelegate, NSURLConnectionDataDelegate {
var callingClass : AnyObject? = nil //To store reference to the "other" class
var searchResults : [[String : AnyObject]]? = nil
init(callingClass: AnyObject) { //I don't know the name of the ViewController class which will instantiates this as it will be called by several different classes
self.callingClass = callingClass
}
func startSearch(searchString: String) {
//NSURLConnection etc
}
func connectionDidFinishLoading(connection: NSURLConnection) {
//more code
searchResults = ...
callingClass!.searchCompleted(searchResults) //Pass the search results back to the class instance which started the search
}
}
Другие Классы:
class RandomViewController : UITableViewController {
//The casting on the next line fails
let Searcher = SearchClass(callingClass: self as! UITableViewController) //OR AnyObject
func randomFunction() {
searcher.startSearch("search query")
}
func searchComplete(searchResults: [[String : AnyObject]]) {
self.searchResults = searchResults
tableView.reloadData()
}
}
Это работает, спасибо. Похоже, что вызов startSearch будет ждать возвращения результата. Если по какой-то причине поиск занял некоторое время, чтобы завершить, это приведет к зависанию пользовательского интерфейса? – Daniel
Да, вы должны выполнить поиск асинхронно в фоновом режиме и выполнить закрытие основного потока при завершении поиска. – joern
Большинство фреймворков предлагают завершениеHandler при отправке запроса. Таким образом, запрос выполняется асинхронно. Все, что вам нужно сделать, это вызвать «resultHandler» в методе завершенияHandler метода запроса. – joern