我正在使用 singleton
类调用 rest api,因为我需要从 3-4 个 View Controller 调用此 api。为了传递数据,我还实现了一种协议(protocol)方法。
我不确定这是传递数据和使用单例类的正确方法。有人可以指导我吗?如果我在代码中遗漏或做错了,请指导我。我感谢你的时间和建议。
//This is my NetworkService class
protocol NetworkServicesDelegate {
// protocol method
func serviceData(arrayData:NSArray)
}
class NetworkServices:NSObject{
static let sharedInstance = NetworkServices()
var delegate: NetworkServicesDelegate?
var dataArray: NSArray?
func getData(paramValue : String,apiName:String)
{
let configURL = NSBundle.mainBundle().objectForInfoDictionaryKey("ConfigURL") as! String
guard let url = NSURL(string: configURL+"/"+apiName) else {
print("Error: cannot create URL")
return
}
let request = NSMutableURLRequest(URL:url)
let defaultSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
request.HTTPMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let params = ["myKey":paramValue]
let valid = NSJSONSerialization.isValidJSONObject(params)
print(valid)
request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(params, options: [])
let task = defaultSession.dataTaskWithRequest(request, completionHandler: { (data:NSData?, response:NSURLResponse?, error:NSError?) in
if let HTTPResponse = response as? NSHTTPURLResponse {
let statusCode = HTTPResponse.statusCode
if statusCode == 200 {
self.dataArray = try! NSJSONSerialization.JSONObjectWithData(data!, options: [] ) as! NSArray
self.serviceData(self.dataArray!)
}
}
})
task.resume()
}
private func serviceData(serviceDataArray: NSArray){
guard self.delegate != nil else {
return
}
delegate?.serviceData(serviceDataArray)
print("serviceDataArray : \(serviceDataArray)")
}
}
最佳答案
您可以按照以下方法:
- 制作一个静态或类函数并将委托(delegate)作为附加参数
- 在比赛处理程序中从 api 下载数据后调用委托(delegate)函数。
然后从任何 View Controller 调用此函数,如下所示:
NetworkServices.getData("yourparam", apiName: "yourAPINAME", delegate: self)
修改后的 NetworkServices 类代码如下:
protocol NetworkServicesDelegate {
func serviceData(arrayData:NSArray)
}
class NetworkServices:NSObject{
class func getData(paramValue : String,apiName:String, delegate:NetworkServicesDelegate?)
{
let configURL = NSBundle.mainBundle().objectForInfoDictionaryKey("ConfigURL") as! String
guard let url = NSURL(string: configURL+"/"+apiName) else {
print("Error: cannot create URL")
return
}
let request = NSMutableURLRequest(URL:url)
let defaultSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
request.HTTPMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let params = ["myKey":paramValue]
let valid = NSJSONSerialization.isValidJSONObject(params)
print(valid)
request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(params, options: [])
let task = defaultSession.dataTaskWithRequest(request, completionHandler: { (data:NSData?, response:NSURLResponse?, error:NSError?) in
if let HTTPResponse = response as? NSHTTPURLResponse {
let statusCode = HTTPResponse.statusCode
if statusCode == 200 {
let dataArray:NSArray = try! NSJSONSerialization.JSONObjectWithData(data!, options: [] ) as! NSArray
delegate?.serviceData(dataArray)
}
}
})
task.resume()
}
}
关于ios - 单例类中的 Swift REST API 调用和协议(protocol)的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255666/