我正在尝试为应用设计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'参数可能是以下之一:
我已经将数据参数设置为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}
]
}
答案 0 :(得分:2)
一次执行太多操作的函数会使代码变得非常混乱。此外,您不需要太多if
语句或enums
- 您的View控制器将快速增长。
我建议拆分请求和解析逻辑。然后,您的API类将对<=> 负责请求。它会将数据返回给另一个负责解析的类。然后在Parser类中,您可以添加toDictionary()
或toArray()
,toArrayOfClasses()
等方法。这将是基本的API结构。
如果你想稍微扩展它,你可以添加另一个可以处理所有逻辑的类层,这样你的View Controller就不知道它是使用API还是其他数据源 - 这样你就可以轻松实现未来的新事物,如Core Data或从您的API类迁移到某个框架,也许是Parse.com - 这一层为您提供了灵活性。
结构示例:
或如果您不想要第三点,您可以直接请求&amp;解析视图控制器。