正在寻找有关Swift 2和iOS 9网络的有用教程,但似乎主题没有在线内容。我已经看过WWDC会话Networking with NSURLSession但是我无法调整iOS9的新API以获取和解析JSON数据的异步方式。我尝试过:
do {
if let url = NSURL(string: "site/api.php?option=fetchOps"),
let data = NSData(contentsOfURL: url),
let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [[String:AnyObject]] {
}
} catch let error as NSError {
print(error.description)
}
请分享您在iOS9和Swift2上的网络体验,任何最佳实践可能是Singleton类用于网络和解析可能是ORM吗?
答案 0 :(得分:9)
How to make an HTTP request in Swift?
或者如果您想自己发送请求:
HTTP POST error Handling in Swift 2
就像一个例子,我在这里转换了一个NSString
首先将NSString转换为NSDictionary
static func convert(src: NSString) -> NSDictionary {
// convert String to NSData
let data = src.dataUsingEncoding(NSUTF8StringEncoding)
var error: NSError?
// convert NSData to 'AnyObject'
let anyObj: AnyObject?
do {
anyObj = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(rawValue: 0))
} catch let error1 as NSError {
error = error1
anyObj = nil
}
if(error != nil) {
// If there is an error parsing JSON, print it to the console
print("JSON Error \(error!.localizedDescription)")
//self.showError()
return NSDictionary()
} else {
return anyObj as! NSDictionary
}
}
然后,像这样使用它
if let name = dictionary["name"] as? String {
self.name = name
}
您可以使用转换后的JSON来制作像这样的对象
import Foundation
class Student {
var name="";
init(dictionary: NSDictionary) {
let _NAME = "name"
if let name = dictionary[_NAME] as? String {
self.name = name
}
}
}
答案 1 :(得分:1)
哦,好吧......搜索swift的异步网络调用。你会发现很多东西。
但是...是......创建一个NSMutableRequest,使用URL初始化,将方法设置为GET或POST。
现在制作:
let task = NSURLSession.sharedSession().dataTaskWithRequest(yourMutableRequest) {
data, response, error in
// do your stuff here
}
task.resume()
这将以异步方式运行,因此您需要考虑一种处理数据的方法。首先,您的响应数据位于变量data
中,这是一种NSData。您将需要它来创建您的字典:
let dictionaryOrArray = NSJSONSerialization.JSONObjectWithData(data, options:.MutableContainers, error: nil)
也许你需要把它放在一个警卫中或者如果让状态。
现在您需要将数据传递给函数调用者...您可以通过多种方式执行此操作,我更喜欢成功和失败块 您调用Request函数并提供成功和失败块。这个块将完成最终应该发生的事情:
let successBlock:[AnyObject]->Void = { response in
// handle your dict
}
let failureBlock:NSError->Void = { error in
// error handling
}
YourClass.fetchSomething(someURL, parameters: params, requestMethod: method, success : successBlock, failure: failureBlock)
这样的事情。在包含数据,响应,错误的请求块中,您只需执行以下操作:
If error {
failure(error)
return
}
success(dictionaryOrArray)