Потеря ответа api при изменении делегата

#ios #swift #delegates

#iOS #swift #делегаты

Вопрос:

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

Я был в viewController1 и запросил api, например, для получения профиля администратора и назначения делегата api для self meaning ( APIClient.delegate = self ) : viewController1 получит ответ, потому что он реализовал делегат клиента api для получения ответа

Теперь, прежде чем ответ вернется, получите профиль администратора. я перешел к ViewController2 и назначил APIClient.delegate = self и запросил здесь другой вызов api. Теперь пришел ответ get admin profile, но он будет отброшен, потому что делегат не равен viewController1, который выполнил запрос или не реализовал метод для обработки ответа профиля!

Вот часть моего кода:

 @objc protocol APIClientDelegate : NSObjectProtocol {
    @objc optional func getAdminProfileFinishedWithResponse(_ dictionary:NSMutableDictionary)
    @objc optional func getAdminProfileFailedWithError(_ error:NSError)
}



@objc class APIClient: APIClientDelegate {

   weak var delegate : APIClientDelegate?


  func getAdminProfile(_ postDictionary:NSMutableDictionary){


        self.get(getUserProfilePath, parameters: postDictionary, progress: nil, success: { (task, response) in

                if self.delegate != nil amp;amp; self.delegate!.responds(to: #selector(APIClientDelegate.getAdminProfileFinishedWithResponse(_:))){
                    self.delegate!.getAdminProfileFinishedWithResponse!((response as! NSDictionary ).mutableCopy() as! NSMutableDictionary)
                }

        }) { (task, error) in

                if self.delegate != nil amp;amp; self.delegate!.responds(to: #selector(APIClientDelegate.getAdminProfileFailedWithError(_:))){
                    self.delegate!.getAdminProfileFailedWithError!(error as NSError)
                }

        }
    }
}
  

Если вы понимаете мою точку зрения, если viewController1 запросил api, чтобы убедиться, что ответ не будет потерян при изменении делегата. Есть идеи о том, как решить это динамически, в фоновом режиме .. и т. Д.?

Комментарии:

1. Пожалуйста, добавьте весь блок кода, в который APIClient.delegate = self включена строка.

2. смогли ли вы решить проблему?

3. Ваши решения хороши, но это может привести к потере очереди запросов. Я просто не уверен! что вы думаете? @Mr.Bista

4. смогли ли вы решить проблему?

Ответ №1:

Чтобы достичь того, чего вы хотите, вы должны создавать объект object of APIClient каждый раз, когда вы выполняете вызов API.

например

 let objClient = APIClient()
objClient.delegate = self
objClient.getAdminProfile(.....
  

таким образом, ссылка на каждый вызов будет содержаться, и вызовы API не будут перекрываться.

Комментарии:

1. я обновил свой код. Я использую одноэлементный клиентский класс api, это правильно или я не должен использовать одноэлементный?

2. Я не думаю, что в этом случае правильно использовать singleton.