将值传递给api时获取nil值

时间:2016-05-16 08:45:29

标签: ios swift

我做的事情:

  1. 我有一个url api,它会在我的表视图中显示一些数据。 2.我获取名为" _id"的特定值。从我的网址,我只是将该值传递给一个自定义类对象。

  2. 然后我将该类对象值传递给我的另一个api调用url。在那里我得到的值为nil。

  3. 这是我将数据填充到我的表视图的代码。我从api" _id"中获取特定值。我将该值存储到一个自定义类对象:

    // Showing favourites
        func populateFavourites()
        {
            let token = NSUserDefaults.standardUserDefaults().valueForKey("access_token") as! String
    
            let headers = ["x-access-token": token]
    
            let request = NSMutableURLRequest(URL: NSURL(string: "some url")!)
            request.HTTPMethod = "GET"
            request.allHTTPHeaderFields = headers
    
            let session = NSURLSession.sharedSession()
            let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
    
                if (error != nil)
                {
                    print(error)
                }
                else
                {
                    dispatch_async(dispatch_get_main_queue(),{
                        if let json = (try? NSJSONSerialization.JSONObjectWithData(data!, options: [])) as? Dictionary<String,AnyObject>
                        {
    
                            print("Success Got Json Data")
    
                            let success = json["success"] as? Int
    
                            if(success == 1)
                            {
                                let jsonData = json["data"] as! NSArray
    
                                if(jsonData.count>0)
                                {
    
    
    
                                    for items in jsonData
                                    {
                                        let BObj = items as! NSDictionary
    
                                        let BusinessDetails = BObj.valueForKey("business_id") as! Dictionary<String,AnyObject>
    
                                        self.FavBusinessValues.append(Businessdata(json:BusinessDetails))
                                                                          print(items)
    
                                         let FavId = BObj.valueForKey("_id") as! String
    
    
                                        self.FavDelete?.FavIds = FavId
    
                                        print(FavId)
    
    
    
    
                                    }
    
                                    self.tableView.reloadData()
    
                                }
                                else
                                {
                                    self.CreateNoDataLabel()
                                }
                            }
                            else
                            {
                                let message = json["message"] as? String
    
                                print("Fav Message ",message)
    
                                let alert = UIAlertController(title: "Error: ", message: message, preferredStyle: UIAlertControllerStyle.Alert)
    
                                // add an action (button)
                                alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
    
                                // show the alert
                                self.presentViewController(alert, animated: true, completion: nil)
                            }
                        }
                    })
                }
            })
            dataTask.resume()
    
        }
    

    在上面的代码中,我正在采取特定的价值&#34; _id&#34;我将转到我的自定义对象类:

     let FavId = BObj.valueForKey("_id") as! String
     self.FavDelete?.FavIds = FavId
     print(FavId)
    

    这个print(FavId)正在打印正确的值。这是我的cutom类对象,它存储&#34; _id&#34;的值。 :

    import Foundation
    class Favdelete
    {
            var FavIds : String?
    
    
        init(json:String)
        {
    
            self.FavIds = json as? String
    
        }
    }
    

    然后我正在通过&#34; _id&#34; objet值FavIds到我的api呼叫。这个代码在下面:

     func apidelete () {
    
    
    
               let Favouriteid = FavDelete?.FavIds
                               print(Favouriteid)
    
                  let userToken = NSUserDefaults.standardUserDefaults().valueForKey("access_token") as! String;
            print(userToken)
    
    
                            let headers = [
                                "x-access-token": userToken,
                                "cache-control": "no-cache",
                                "postman-token": "81fbd1fc-c333-3ceb-272a-a9ecffb2dad2",
                                "content-type": "application/x-www-form-urlencoded"
                            ]
    
    
    
    
            let FBI = "favourite_id="+Favouriteid!
    
    
            let postData = NSMutableData(data: FBI.dataUsingEncoding(NSUTF8StringEncoding)!)
    
                            let request = NSMutableURLRequest(URL: NSURL(string: "some url")!,
                                                              cachePolicy: .UseProtocolCachePolicy,
                                                              timeoutInterval: 10.0)
    
            let session = NSURLSession.sharedSession()
            let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
                if (error != nil) {
                    print(error)
                } else {
                    let httpResponse = response as? NSHTTPURLResponse
                    print(httpResponse)
                    dispatch_async(dispatch_get_main_queue(),{
                        if let json = (try? NSJSONSerialization.JSONObjectWithData(data!, options: [])) as? Dictionary<String,AnyObject>
                        {
    
                            print("Success Got Json Data");
    
                            let success = json["success"] as? Int;
    
                            var message:String = "";
    
                            if(success == 1)
                            {
                                message = json["message"] as! String;
                            }
                            else
                            {
                                message = json["message"] as! String;
                            }
    
                            print(message);
    
                            let alert = UIAlertController(title: "Message from server", message: message, preferredStyle: UIAlertControllerStyle.Alert)
    
                            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
    
                            self.presentViewController(alert, animated: true, completion: nil)
    
                        }
                    })
    
                }
            })
    
            dataTask.resume()
    
    
    
    
        }
    

    当我尝试打印时:

    let Favouriteid = FavDelete?.FavIds
      print(Favouriteid)
    

    我遇到了崩溃,它在我的控制台中说没有打印。

    任何人都可以帮助我。!!

    更新:

    在我的第一个函数方法下。那就是当我得到特定值并将该值存储到我的自定义对象时。我只是打印它。我也在那里也没有。

    该行是:

    let FavId = BObj.valueForKey("_id") as! String
     self.FavDelete?.FavIds = FavId
    print(self.FavDelete?.FavIds)
    

    它的印刷没有

    更新:

    enter image description here

    enter image description here

1 个答案:

答案 0 :(得分:1)

虽然您有自定义类,但您需要初始化它以使用其方法。如果没有正确的初始化,则无法设置其属性。 所以在ViewController中,在顶部声明该类的对象。 var FavbDelete : Favdelete? 此时,您的FavDelete为零。

然后从populateFavourites()方法获得“_id”。您可以从viewDidLoad()方法调用它。在那里你得到了FabId let FavId = BObj.valueForKey("_id") as! String 但是现在你不能直接将它存储到FabDelete对象中。因为它尚未初始化。虽然Xcode在您执行此操作时不会抛出任何错误,但结果值将为零。所以现在使用在自定义类中构建的初始化程序初始化该对象。

self.FavDelete = Favdelete(json: FavId)

现在初始化FavDelete对象,并且在此步骤之后调用apidelete()方法时,可以使用

访问id的值
let someVar = self.FavDelete?.FavIds

由于所有这些工作都是在后台使用NSURLSession完成的,因此请确保在apidelete对象初始化之前不要调用FabDelete