在我的应用程序中我正在使用JSON并且我最近进行了一次会话,因此如果我想为特定用户提供一些http请求以获取数据,则用户必须先登录(也由http请求使用)。 在safari中,当我输入登录的url然后输入接收数据的url时,它会根据需要执行此操作。 但在我的应用程序中,我首先调用登录,然后调用获取数据的URL,但它可能在每个URL请求中启动一个新会话,这导致我收到错误而没有收到数据。 我的网址请求功能是:
static func urlRequest (adress: String, sessionEnded: (NSDictionary->Void)?){
println(adress)
var urli = NSURL(string: adress)
var request = NSURLRequest(URL: urli!)
var rVal = "";
self.task = NSURLSession.sharedSession().dataTaskWithURL(urli!) {(data, response, error) in
var parseError: NSError?
let parsedObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data,
options: NSJSONReadingOptions.AllowFragments,
error:&parseError)
let po = parsedObject as NSDictionary
if let a = sessionEnded{
sessionEnded!(po)
}
}
task!.resume()
}
提前感谢!!
答案 0 :(得分:0)
您只与我们共享了一半的拼图,即客户端代码。我们无法评论为什么应用程序无法更清楚地了解服务器API的内容。例如,一旦“登录”,后续查询如何确认请求来自有效会话。此外,您报告“每个网址请求导致我收到错误”。那么,你收到什么错误?关于您收到的确切错误/崩溃,您必须更加具体。顺便说一句,您是使用定义良好的API登录某些服务还是自己编写代码?
话虽如此,我可能会建议对此方法进行一些改进:
sessionEnded
(我已将其重命名为completionHandler
以符合非正式的标准命名约定),可能也应返回一个可选的NSError
对象,因此调用者可以检测是否有错误。
您可以简化sessionEnded
完成处理程序的展开以使用?
。
解析对象时,您也应该随意执行可选的强制转换。
您可能希望检测到网络错误(在这种情况下data
将为nil
)并返回网络NSError
对象。
小点,但我可能还会重命名该函数以符合Cocoa命名约定,使用动词来启动名称。也许像performURLRequest
。
这是你的调用,但是我倾向于让方法返回NSURLSessionTask
,这样调用者就可以使用该任务对象(例如保存任务对象,以便如果它想要,它可以cancel
。
因此,产生类似的东西:
func performURLRequest (address: String, completionHandler: ((NSDictionary!, NSError!) -> Void)?) -> NSURLSessionTask {
let url = NSURL(string: address)
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
if data == nil {
sessionEnded?(nil, error)
} else {
var parseError: NSError?
let parsedObject = NSJSONSerialization.JSONObjectWithData(data, options: nil, error:&parseError) as? NSDictionary
completionHandler?(parsedObject, parseError)
}
}
task.resume()
return task
}
你会像以下一样调用它:
performURLRequest("http://www.example.com/some/path") { responseDictionary, error in
if responseDictionary == nil {
// handle error, e.g.
println(error)
return
}
// use `responseDictionary` here
}