В прошлый день, когда я выполнял вызовы api с помощью almofire, я наткнулся на странный вызов метода, который был чем-то вроде создания объекта almofire с последующим вызовом метода с созданным объектом, за которым следовал другой метод после точки (.) , затем еще один метод и так далее ...
Вызов API, о котором я говорил, выглядит примерно так:
Здесь мы вызываем метод request
в классе Almofire
. Затем следует метод validate(statusCode:)
, затем другой метод validate(contentType:)
. Затем, наконец, мы можем увидеть метод с именем responseData
с trailing closure
, который возвращает результат вызова api.
Как это работает?? Что ж, логика довольно проста.
Сделать функции связанными довольно просто, и мы можем писать, используя синтаксис, почти подобный DSL.
Мы добавим новую функцию, которая что-то сделает, а затем вернем
self
. Это так просто.
Давайте проясним. у нас обычно есть init
метод для инициализации объекта класса. У нас может быть несколько designated
, а также convenience
инициализаторов, чтобы упростить нашу работу. У нас могут быть пользовательские параметры для инициализации объекта класса. Рассмотрим класс с именем Celcius
.
class Celsius { var temperatureInCelsius: Double init(fromFahrenheit fahrenheit: Double) { temperatureInCelsius = (fahrenheit — 32.0) / 1.8 } init(fromKelvin kelvin: Double) { temperatureInCelsius = kelvin — 273.15 } func printTemperature() { print(“Temperature is \(temperatureInCelsius)”) } }
У нас есть два метода инициализации: один принимает температуру в kelvin
, другой в fahrenheit
. Следующий синтаксис создает объект класса Celcius
, и, используя этот объект, мы можем вызвать метод экземпляра.
Celsius(fromKelvin: 400).printTemperature() // prints Temperature is 126.85
Если вы знаете, как работает приведенный выше код, то понимание цепочки методов almofire
, упомянутых в начале статьи, легко понять.
Пример методов цепочки:
Давайте создадим APICaller
класс.
Вызов api обычно имеет url
, http method
и parameters
. Если мы воспользуемся указанным выше классом для вызова API, он будет выглядеть примерно так.
let params = [“key1”:”value1",”key2":”value2"] APICaller().urlString(“www.google.com").method(.post).parameters(params).response { (resultDict) in print(resultDict[“result”]!) } //---------------- // prints the following in console. ( "Result values1", "Result values2", "Result values3", "Result values4" )
Давайте разберемся с вышеупомянутым призывом.
- Создайте экземпляр класса
APICaller
. - Вызов метода
urlString
со строкой в качестве параметра. Это установит свойствоurl
в классеAPICaller
и вернетself
. - Вызвать
method
метод, который устанавливает свойствоmethod
классаAPICaller
, и возвращаетself
. - Вызвать
parameters
метод, который устанавливает параметры для вызова API и возвращаетself
. - Наконец, вызовите метод
response
, который имеет завершающее закрытие в качестве параметра. Здесь выполните вызов API и в случае успеха или неудачи вызовите закрытие обратного вызова с объектом результата. Здесь замыкание принимает только словарь типаDictionary<String,AnyObject>
.
Надеюсь, все ясно. Либо мы можем иметь один метод инициализации со всеми этими параметрами и вызывать метод, который, в свою очередь, вызывает api и возвращает ответ. Но здесь самое большое преимущество состоит в том, что нам нужно вызывать любой метод цепочки только тогда, когда это необходимо. Если мы выполняем вызов метода get
, мы можем пропустить вызов метода method
, поскольку get указывается в качестве метода по умолчанию внутри кода. Также, если параметры не требуются, мы можем их пропустить.
Наша цель - писать меньше кода, который имеет больше смысла !!!
Наслаждаться!!