2017-11-06 1 views
1

비슷한 질문은 이미 요청했지만 도움을받지 못했습니다. 내가보기 프로토콜에서 Singleton 클래스에서 선언 된 프로토콜 메서드를 호출하려고하지만 호출 된 메서드는 호출하지 않습니다. 대리인 메서드가 싱글 톤을 사용하여 호출되지 않았습니다

내 프로토콜과 클래스

은 다음과 같습니다 프로토콜을 구현

import Foundation 

protocol ServiceDelegate { 
    func serviceData(data: [String: Any]) 
} 

class Service { 

private static let sharedInstance = Service() // singleton object 
var delegate: ServiceDelegate? 

class func shared() -> Service { 
    return sharedInstance 
} 

func login(postData:String) { 

    let url = URL(string: "MY_URL")! 
    var request = URLRequest(url: url) 
    request.httpMethod = "POST" 
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
    let dataBody = postData.data(using:String.Encoding.ascii, allowLossyConversion: false) 
    request.httpBody = dataBody 
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in 
     guard let data = data, error == nil else { 
      print(error?.localizedDescription ?? "No data") 
      return 
     } 
     let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) 
     if let dataArray = responseJSON as? [String: Any] { 
      self.delegate?.serviceData(data: dataArray) // This is getting called 
     } 
    } 
    task.resume() 
    } 
} 

내보기 컨트롤러 클래스는 다음과 같습니다

import UIKit 

class LoginVC: UIViewController, ServiceDelegate { 

var serviceInstance: Service = Service() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    serviceInstance.delegate = self 
} 

@IBAction func loginBtn(_ sender: Any) { 
    let info = "userName=\(String(describing: usernameText.text!))&password=\(String(describing: passwordText.text!))" 
    Service.shared().login(postData: info) 
} 

// This is not getting called: 
func serviceData(data: [String : Any]) { 
    print(data) 
} 

위의 구현이 맞습니까? 개인 싱글 톤 객체를 사용하여 프로토콜 메소드를 성공적으로 구현할 수 있습니까?

+0

delegate = self.delegate { // 여기에서 작업 하시겠습니까? } els e { print ("The delegate is nil") }하지만 그게 아무것도 없음 –

+0

https://medium.com/ios-os-x-development/ios-three-ways-to-pass-data-from- 모델 - 투 - 컨트롤러 - b47cc72a4336 –

답변

0

두 개의Service 인스턴스를 만듭니다. Service.shared()에 의해 반환 된 것을 사용해야합니다. 실제 앱에서 공유되는 싱글 톤입니다.

Service.shared().delegate = self 

그리고 당신은 또한 (즉, 불필요한 두 번째 인스턴스)이 줄을 삭제해야합니다 :와

serviceInstance.delegate = self 

:보기 컨트롤러에서

는이 라인을 교체

var serviceInstance: Service = Service() 
관련 문제