未使用单例调用委托方法
Delegate method not called using Singleton
已经有人问过类似的问题,但没有帮助。我正在尝试从视图控制器调用 Singleton
class 中声明的协议方法,但被调用的方法从不调用。
我的协议和 class 是:
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()
}
}
我的视图控制器class实现协议的地方是:
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)
}
以上实现是否正确?我可以使用私有单例对象来成功实现协议方法吗?
您正在创建 两个 Service
个实例。您应该只使用 Service.shared()
返回的那个。这是在您的应用程序中共享的实际 单例。
在您的视图控制器中,替换此行:
serviceInstance.delegate = self
与:
Service.shared().delegate = self
你也应该删除这一行(即不必要的第二个实例):
var serviceInstance: Service = Service()
已经有人问过类似的问题,但没有帮助。我正在尝试从视图控制器调用 Singleton
class 中声明的协议方法,但被调用的方法从不调用。
我的协议和 class 是:
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()
}
}
我的视图控制器class实现协议的地方是:
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)
}
以上实现是否正确?我可以使用私有单例对象来成功实现协议方法吗?
您正在创建 两个 Service
个实例。您应该只使用 Service.shared()
返回的那个。这是在您的应用程序中共享的实际 单例。
在您的视图控制器中,替换此行:
serviceInstance.delegate = self
与:
Service.shared().delegate = self
你也应该删除这一行(即不必要的第二个实例):
var serviceInstance: Service = Service()