I am using a Service class where a protocol is declared. This protocol is implemented by two viewcontrollers, i.e. DashboardVC
and DashboardDetailVC
. Protocol works fine when called from DashboardVC
. Then in DashboardDetailVC
also, it works fine calling protocol method defined in DashboardDetailVC
. BUT, when I dismiss DashboardDetailVC
and move back to DashboardVC
, then protocol method of DashboardDetailVC
is called. My code is:
Service.swift
protocol DashboardDelegate {
func dashboardInfoResponse(data: [String: Any])
}
class Service {
var dashboardDelegate: DashboardDelegate?
func hitWebRequest(api: String, request: URLRequest) {
..
self.dashboardDelegate?.dashboardInfoResponse(data: dataArray)
..
}
}
DashboardVC.swift
class DashboardVC: DashboardDelegate {
override func viewDidLoad() {
super.viewDidLoad()
Service.shared().dashboardDelegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
Service.shared().dashboardInfo(postData: token)
}
func dashboardInfoResponse(data: [String : Any]) {
..
..
}
DashboardDetailVC.swift
class DashboardDetailVC: DashboardDelegate {
override func viewDidLoad() {
super.viewDidLoad()
Service.shared().dashboardDelegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
Service.shared().dashboardInfo(postData: token)
}
func dashboardInfoResponse(data: [String : Any]) {
..
..
}
When I go back from DashboardDetailVC
to DashboardVC
using
dismiss(animated: true, completion: nil)
protocol method from DashboardVC
is called, But still it returns to dashboardInfoResponse
protocol method in DashboardDetailVC
.
This is obvious You have class Service
which has sharedInstance
that means only single object is been used in whole application cycle.. And only single delegate property been shared among all.
Observe that
DashboardVC
in viewDidLoad
you set delegate
to self
that means it is pointing to DashboardVC
After that you present DashboardDetailVC
you set delegate
to self
that means it is pointing to DashboardDetailVC
and after that your all delegate call will go to DashboardDetailVC
not to DashboardVC
even though you dismiss VC
To fix this: You have options.
1) Don't use Shared Instance
2) set delegate in ViewWillAppear
instead.
3) Use NotificationCenter and post notification
Hope it is helpful to you