在Swift中创建灵活的API类

时间:2015-11-17 19:45:49

标签: ios json swift

我正在尝试为应用设计API辅助函数。我的想法是,我将能够使用以下代码调用viewController中的函数:

let api = APIController();
api.request("get_product_list")
api.delegate = self

到目前为止,这是班级:

import Foundation

protocol APIControllerProtocol {
 func didReceiveAPIResults(originalRequest: String, status: Bool, data: String, message: String)
}


class APIController { 

 var delegate: APIControllerProtocol?

 let url = "https://example.co.uk/api.php"
 let session = NSURLSession.sharedSession()
 let appID = "EXAMPLEAPPID";
 let deviceID = "EXAMPLEDEVICE"

 func request(req:String)-> Void {
    let urlString = "\(url)?request=\(req)"
    let combinedUrl = NSURL(string: urlString)
    let request = NSMutableURLRequest(URL: combinedUrl!)
    request.HTTPMethod = "POST"
    let stringPost="app_id=\(appID)&device_id=\(deviceID)"
    let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding)

    request.timeoutInterval = 60
    request.HTTPBody=data
    request.HTTPShouldHandleCookies=false

    let task = session.dataTaskWithRequest(request) {
        (data, response, error) -> Void in
        do {
            let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers ) as! NSDictionary
            let statusInt = jsonData["status"]! as! Int
            let status = (statusInt == 1)
            let data = String(jsonData["data"])
            let message = String(jsonData["message"])
            self.delegate?.didReceiveAPIResults(req,status: status,data: data,message: message)
        } catch _ {
            print("ERROR")
        }
    }
    task.resume()
 }
}

我遇到的困难是'data'参数可能是以下之一:

  1. 字符串/数字,例如客户购买的数量
  2. 一系列项目,例如产品列表
  3. 字典,例如客户的详细信息
  4. 我已经将数据参数设置为String,因为这允许我进行一些测试,但是然后将其转换回可用于tableView的东西变得非常混乱。

    这里有专家可以告诉我最好的方法吗?也许告诉我如何在cellForRowAtIndexPath方法中使用结果?以下是来自API的示例响应,以防它有用:

    {
    "status":1,
    "message":"",
    "cached":0,
    "generated":1447789113,
    "data":[
        {"product":"Pear","price":0.6},
        {"product":"Apple","price":0.7},
        {"product":"Raspberry","price":1.1}
    ]
    }
    

1 个答案:

答案 0 :(得分:2)

一次执行太多操作的函数会使代码变得非常混乱。此外,您不需要太多if语句或enums - 您的View控制器将快速增长。

我建议拆分请求和解析逻辑。然后,您的API类将对<=> 负责请求。它会将数据返回给另一个负责解析的类。然后在Parser类中,您可以添加toDictionary()toArray()toArrayOfClasses()等方法。这将是基本的API结构。

如果你想稍微扩展它,你可以添加另一个可以处理所有逻辑的类层,这样你的View Controller就不知道它是使用API​​还是其他数据源 - 这样你就可以轻松实现未来的新事物,如Core Data或从您的API类迁移到某个框架,也许是Parse.com - 这一层为您提供了灵活性。

结构示例:

  1. API - 请求
  2. 解析器 - 解析API响应
  3. DataManager - 向API发送请求并返回已解析的响应。
  4. 如果您不想要第三点,您可以直接请求&amp;解析视图控制器。