在返回时展开一个Optional值时意外地发现了nil

时间:2016-03-03 03:31:57

标签: ios json swift rest

我正在调用Url,它会在get()函数中给我Json。 我从另一个类调用get()函数并尝试以Array格式返回Json的结果。但它在return语句中显示Found null错误。当我试图打印Json的值时,它正确写入。 这是我在swift中的代码。

 func get() -> NSArray
        {
            let postEndpoint: String =  "Link_For_JSON_Data"
            let session = NSURLSession.sharedSession()
            let url = NSURL(string: postEndpoint)!
            var jsonArray : NSArray?
            var jsonArray1 : NSArray?

            session.dataTaskWithURL(url, completionHandler: { ( data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
                // Make sure we get an OK response
                guard let realResponse = response as? NSHTTPURLResponse where
                    realResponse.statusCode == 200 else
                {
                        print("Not a 200 response")
                        return
                }

                // Read the JSON
                do
                {
                    if let contentString = NSString(data:data!, encoding: NSUTF8StringEncoding)
                    {
                        // Print what we got from the call
                        jsonArray = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSArray
                        print("jsonArray here", jsonArray)
                        // Update the label

                        dispatch_async(dispatch_get_main_queue())
                            { () -> Void in
                            self.getDataFormREST(jsonArray!)
                            }

                    }
                }

                catch
                {
                    print("bad things happened")
                }

            }).resume()

       return jsonArray!
        }

     func getDataFormREST(resultArray: NSArray) //-> NSArray
        {
            //        let resultDictionary = resultArray[(searchDetails)!-1] as! NSDictionary
            testArray = resultArray
            print("TESTArray ON ",testArray)
    }

1 个答案:

答案 0 :(得分:0)

您无法编写执行异步调用的函数,然后将结果作为函数结果返回。这不是异步代码的工作原理。您的函数将异步dataTaskWithURL请求排队,然后在它甚至有机会发送请求之前返回,更不用说接收结果了。

您必须将get()函数重写为void函数(未返回结果),但需要完成块。然后,在您的数据任务的完成处理程序中,您可以从jsonArray获取数据并调用get()函数的完成块,并将jsonArray传递给它。

看到我在Github上发布的这个项目说明了我在谈论的内容:

SwiftCompletionHandlers on Github