ios - 单例类中的 Swift REST API 调用和协议(protocol)的使用

标签 ios swift singleton nsurlsession swift-protocols

我正在使用 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/

相关文章:

ios - 在 SpriteKit 和 Swift 中关闭 SKScene

ios - Tabbar Design 在 iPhone X 上显示不正确

ios - IOS中单例的使用及注意事项

eclipse - 关于 list 文件中的 'singleton:=true'

iphone - 使用 Amazon IOS SDK 上传 S3

iphone - 连接NSMutableArray中的所有元素以形成NSString

ios - 如果让 OR 条件

ios - 如何在 Alamofire Post 请求后有一个完成处理程序/ block ?

swift - 如何使用 map 函数快速从数组中获取替代索引数据

iphone - 是 self 释放,释放的实际对象吗?