在http请求swift中保存会话

时间:2015-01-08 19:58:23

标签: ios json http session swift

在我的应用程序中我正在使用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()

}

提前感谢!!

1 个答案:

答案 0 :(得分:0)

您只与我们共享了一半的拼图,即客户端代码。我们无法评论为什么应用程序无法更清楚地了解服务器API的内容。例如,一旦“登录”,后续查询如何确认请求来自有效会话。此外,您报告“每个网址请求导致我收到错误”。那么,你收到什么错误?关于您收到的确切错误/崩溃,您必须更加具体。顺便说一句,您是使用定义良好的API登录某些服务还是自己编写代码?


话虽如此,我可能会建议对此方法进行一些改进:

  1. sessionEnded(我已将其重命名为completionHandler以符合非正式的标准命名约定),可能也应返回一个可选的NSError对象,因此调用者可以检测是否有错误。

  2. 您可以简化sessionEnded完成处理程序的展开以使用?

  3. 解析对象时,您也应该随意执行可选的强制转换。

  4. 您可能希望检测到网络错误(在这种情况下data将为nil)并返回网络NSError对象。

  5. 小点,但我可能还会重命名该函数以符合Cocoa命名约定,使用动词来启动名称。也许像performURLRequest

  6. 这是你的调用,但是我倾向于让方法返回NSURLSessionTask,这样调用者就可以使用该任务对象(例如保存任务对象,以便如果它想要,它可以cancel

  7. 因此,产生类似的东西:

    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
    }