Разница между обратным вызовом и обработчиком соревнований в Swift - PullRequest
0 голосов
/ 01 июля 2019

В рамках комбината я нашел следующий текст

Платформа Combine обеспечивает декларативный подход к тому, как ваше приложение обрабатывает события. Вместо того, чтобы потенциально реализовать несколько делегировать обратные вызовы или обработчик завершения

Может кто-нибудь сказать мне, в чем разница между обработчиком завершения и обратным вызовом в Swift?

Ответы [ 5 ]

0 голосов
/ 01 июля 2019

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

позвольте мне проиллюстрировать на простом примере, что различие между обоими с одной и той же функцией создает сетьвызов

  • протокол делегата
    // enum to define the request type

enum RequestTypes {

    case UserRegister
    case UserLogin

}

protocol ServiceDelegate {

    func didCompleteRequest(responseModel: AnyObject, tag: RequestTypes)

}

// you can also add default impl to the methods here

extension ServiceDelegate {

    func didCompleteRequest(responseModel: AnyObject, tag: RequestTypes){}

}


class BaseService<ResponseModel: Codable> {

    var session: URLSession!
    var delegate: ServiceDelegate?

    // MARK: Rebuilt Methods
    func FireRequest(){

        // Request Preparation
        let serviceUrl = URL(string: /* your url */)!
        var request = URLRequest(url: serviceUrl)
        request.httpMethod = "GET"


        // Firing the request
        session = URLSession.init(configuration: URLSessionConfiguration.default)
        session.dataTask(with: request) { (data, response, error) in
            if let data = data {
                do {
                    guard let object = try? JSONDecoder().decode(ResponseModel.self , from: data) else {/* handle error or call delegate error method here */ return }
                    delegate?.didCompleteRequest(responseModel: object, tag: .UserLogin)
                }
            }
            }.resume()
    }

}



class ViewController: UIViewController, ServiceDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchNewData()
    }

    func fetchNewData(){
        let service = BaseService<YourModel>()
        service.delegate = self
        service.FireRequest()
    }

    func didCompleteRequest(responseModel: AnyObject, tag: RequestTypes) {
        if tag == /* the tag you are waiting */ .UserLogin {
            // YourModel is available here
        }
    }


}

  • обработчик завершения

class BaseService<ResponseModel: Codable> {

    var session: URLSession!

    // MARK: Rebuilt Methods

    func FireRequest(completion: ((ResponseModel?) -> Void)?){

        // Request Preparation
        let serviceUrl = URL(string: /* your url */)!
        var request = URLRequest(url: serviceUrl)
        request.httpMethod = "GET"


        // Firing the request
        session = URLSession.init(configuration: URLSessionConfiguration.default)
        session.dataTask(with: request) { (data, response, error) in
            if let data = data {
                do {
                    guard let object = try? JSONDecoder().decode(ResponseModel.self , from: data) else {/* handle error or call delegate error method here */ return }
                    DispatchQueue.main.async {
                        completion?(object)
                    }
                }
            }
            }.resume()
    }

}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchNewData()
    }

    func fetchNewData(){

        let service = BaseService<YourModel>()

        service.FireRequest(completion: { [weak self] (response) in
            // yourModel Available here once the request completed
        })

    }

}
0 голосов
/ 01 июля 2019

Обратный вызов - это способ отправки данных обратно какой-либо другой функции в конкретном случае.Есть 2 способа реализовать обратные вызовы в Swift.

  1. Использование протоколов / делегата
  2. Использование обработчика завершения

Использование протоколов / делегата Пример:

Объявление протокола

protocol MyDelegate {
     public method(param: String);
}

Ваш ViewController должен расширять делегат

class YourViewController: MyDelegate {
     // Your Other methods

     func method(param: String) {
      // Do your stuff
     }
 }

Теперь в других ваших классах вы можете отправлять обратный вызов в ViewController через объект делегата, например

delegate.method(param: "your_param");

Используя обработчик завершения Пример:

public func method(param: String, completionHandler: @escaping (_ param: String) -> Void)
{
    ...
    // now you can send data back to the caller function using completionHandler on some particular occasion 
     completionHandler("param");
}

Мы можем вызвать эту функцию как

method(param: String, completionHandler: { (result, alreadyUserId) in
      // here you will receive callback
});
0 голосов
/ 01 июля 2019

Обратный вызов делегата - это когда у вас есть делегат, который, как вы знаете, заранее реализует метод (например, потому что он принимает протокол), и вы вызываете этот метод по имени.

Обработчик завершения - это когда кто-то передаетвы функция, и вы просто вызываете ее слепо по ссылке.

0 голосов
/ 01 июля 2019

Обратный вызов делегата - это связь один на один между различными ViewControllers и классами.В основном это позволяет вам знать, что определенное изменение было сделано в определенном виде или в любом другом месте, и теперь вы можете вносить изменения после этого действия.

Хотя обработчик завершения - это блок, выполняемый после завершения определенного процесса или задачи.

0 голосов
/ 01 июля 2019

Обратные вызовы и обработчики завершения являются синонимами при обращении к асинхронным методам.

Я обнаружил, что основным отличием является то, как оно используется при определении того, что возвращается вызывающей стороне, где используется обратный вызов при обращении к методу, где область возвращается к предыдущему вызывающему методу, а обработчик завершения ссылается на метод когда он возвращает некоторый тип Result вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...