Swift REST API 单例调用 class 和协议的使用

Swift REST API call in singleton class and use of protocol

我正在使用 singleton class 调用 rest api,因为我需要从 3-4 个视图控制器调用此 api。为了传递数据,我还实现了一种协议方法。 我不确定这是传递数据和使用单例的正确方法 class。有人可以指导我吗?如果我在代码中遗漏或做错了,请指导我。我感谢你的时间和建议。

//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)")
    }

}

您可以按照以下方法:

  • 制作静态或class函数并将委托作为附加参数
  • 从竞争处理程序中的 api 下载数据后调用委托函数。
  • 然后从任何视图控制器调用此函数,如下所示:

    NetworkServices.getData("yourparam", apiName: "yourAPINAME", delegate: self)
    

修改了网络服务 class 下面的代码。:

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()
  }   
}