2017-02-16 6 views
0

Пользователи ищут города по имени в моем приложении, после чего я делаю несколько вызовов API из разных источников, чтобы получить информацию о городах.Swift: Остановить метод от завершения

Я хочу добавить кнопку «Стоп», чтобы пользователь мог остановить поиск, если, например, у них плохое соединение wifi, и поиск занимает слишком много времени. У меня есть мои вызовы API разными способами, поэтому я не буду знать, какой из них выполняется, когда пользователь нажимает кнопку «Стоп».

Кто-нибудь знает, как остановить все функции или даже вызовы API, запущенные в приложении, когда пользователь нажимает кнопку «Стоп»?

Я включил предложенное ниже решение, но хотел бы знать, есть ли у кого-то более элегантное решение.

+0

В основном, мне кажется, вы описываете NSOperation. Я бы посоветовал вам изучить, что вместо того, чтобы изобретать колесо. Перемещая всю свою операцию в свой класс, вы позволяете выполнять операцию _each_ отдельно, без путаницы с вашими временными метками. – matt

+0

@matt спасибо, я не знаком с NSOperation. Какие хорошие рекомендации вы рекомендуете мне взглянуть? – Gibraltar

ответ

0

Мое предлагаемое решение состоит в том, чтобы иметь две переменные, которые хранят временные метки, постоянную переменную и другую, созданную в методе действий, которая вызывается, когда пользователь нажимает кнопку «Поиск». Она будет работать следующим образом:

  • пользователь щелкает Найти!
  • Постоянная переменная сохраняется с точным временем поиска: 2017_02_16_4: 35: 26 (дата и время до нескольких секунд), то переменная, созданная в метод действия производится в соответствии с постоянной переменной
  • После API вызовы будут завершены, но до того, как переход, чтобы показать новую информацию срабатывает, я буду проверять, чтобы убедиться, что обе переменные все еще находятся в синхронизации

  • Если пользователь нажимает кнопку остановки, я буду менять постоянную переменную на время нажата кнопка «Стоп», а segue не будет выполняться, потому что две переменные не совпадают.

    var permanentTimestamp = String() 
    
    @IBAction func searchButton(_ sender: Any) { 
        permanentTimestamp = // whatever the current time is 
        self.beginAPICalls() 
    } 
    
    func beginAPICalls() { 
        let uniqueCallTimestamp = permanentTimestamp 
    
        //... perform API calls and get information 
    
        if uniqueCallTimestamp == permanentTimestamp { 
          // perform segue 
        } else { 
          // the segue won't be triggered and the user can search again without having two searches go through 
        } 
    } 
    

я рассмотрел только с помощью логических значений, но потенциальная проблема будет, если пользователь имеет подключение к Интернету, но это очень медленно. Пользователь мог выполнить поиск (bool = true), нажать «Стоп» (bool = false), а затем снова нажать «Поиск снова» (bool = true) до завершения первого набора вызовов API. Теперь bool является истинным, позволяя выполнить segue, но оба вызова будут сделаны.

Смежные вопросы