Search code examples
iosswiftuitableviewswift3alamofire

Tableview data not displaying in Alamofire post request call swift 3


Im using an API to get the user info like Address. in this app user can enter multiple address and i have made a button on pressed it will make the address as default in tableview cell. When i pressed the button to address make default it makes the address default but not showing the addresses in tableview cells. Even i have used dispatch.main.async().

My Button Code to make default Address. just table cells not showing data when its done default.

func makeAddressDefault(_ sender: UIButton) {
        let address = addresses[sender.tag]
        let params:Parameters = ["userid": Globals.sharedInstance.user!.id, "addressid": address.id!]
        let url = "/makeaddressdefault?userid=" + Globals.sharedInstance.user!.id
        RestApiManager.sharedInstance.makePostRequest(vc:self, url: url, post:params, successCompletionHandler:{
            (data) in
            self.addresses.removeAll() // array of addresses
            self.reloadAddresses() // in this reload method in last i have added self.tableview.reload()
        }, failureCompletionHandler:{(data) in })
    }

//ReloadAddress mehtod is defined here.

 private func reloadAddresses()
    {
        Globals.sharedInstance.user!.addresses.removeAll()
        Globals.sharedInstance.getUserAddresses(vc: self)
        self.addresses = Globals.sharedInstance.user!.addresses

        self.tableView.reloadData()
    }

//getUserAddresses() method written here.

public func getUserAddresses(vc:BaseViewController) {
        if(Globals.sharedInstance.user!.addresses.count == 0)
        {
        let url = "/useraddresses?userid=" + Globals.sharedInstance.user!.id
        RestApiManager.sharedInstance.makeGetRequest(vc:nil, url: url){
            (data) in
            // parse the result as JSON, since that's what the API provides
            do {
                guard let jsonResponse = try JSONSerialization.jsonObject(with: data, options: [])
                    as? [[String: Any?]] else {
                        print("error trying to convert data to JSON")
                        return
                }

                let foodieprofile = jsonResponse[0]
                let addresses = foodieprofile["foodieprofile"] as! [String: Any?]
                let jsonAddresses = addresses["deliveryaddress"] as! [[String: Any?]]

                if(jsonAddresses.count>0 && Globals.sharedInstance.user!.addresses.count==0)
                {

                    for index in 0...jsonAddresses.count-1 {
                        let this_address = jsonAddresses[index]
                        var isdeff = false
                        if let isdef = this_address["isdefault"] as? Bool
                        {
                            isdeff = isdef
                        }
                        let address = Address(id:this_address["_id"] as! String?, name:this_address["name"] as! String?, address:this_address["address"] as! String?, address2:this_address["address2"] as! String?, zone:this_address["zone"] as! String?, city:this_address["city"] as! String?, landmark:this_address["landmark"] as! String?, phone:this_address["phone"] as! String?, isdefault:isdeff)

                        Globals.sharedInstance.user!.addresses += [address]
                    }
                }
            } catch  {
                print("error trying to convert data to JSON")
                return
            }
        }
        }
    }

}

Any Help will be appreciated.


Solution

  • you need to add closure in your getUserAddresses method as below

    public func getUserAddresses(vc:BaseViewController, callback: (_ issuccess: Bool) -> Void) {
            if(Globals.sharedInstance.user!.addresses.count == 0)
            {
                let url = "/useraddresses?userid=" + Globals.sharedInstance.user!.id
                RestApiManager.sharedInstance.makeGetRequest(vc:nil, url: url){
                    (data) in
                    // parse the result as JSON, since that's what the API provides
                    do {
                        guard let jsonResponse = try JSONSerialization.jsonObject(with: data, options: [])
                            as? [[String: Any?]] else {
                                print("error trying to convert data to JSON")
                                return
                        }
    
                        let foodieprofile = jsonResponse[0]
                        let addresses = foodieprofile["foodieprofile"] as! [String: Any?]
                        let jsonAddresses = addresses["deliveryaddress"] as! [[String: Any?]]
    
                        if(jsonAddresses.count>0 && Globals.sharedInstance.user!.addresses.count==0)
                        {
    
                            for index in 0...jsonAddresses.count-1 {
                                let this_address = jsonAddresses[index]
                                var isdeff = false
                                if let isdef = this_address["isdefault"] as? Bool
                                {
                                    isdeff = isdef
                                }
                                let address = Address(id:this_address["_id"] as! String?, name:this_address["name"] as! String?, address:this_address["address"] as! String?, address2:this_address["address2"] as! String?, zone:this_address["zone"] as! String?, city:this_address["city"] as! String?, landmark:this_address["landmark"] as! String?, phone:this_address["phone"] as! String?, isdefault:isdeff)
    
                                Globals.sharedInstance.user!.addresses += [address]
                                callback(true) // return true.....add this line
                            }
                        }
                    } catch  {
                        print("error trying to convert data to JSON")
                        callback(false) // return false.....add this line
    
                        return
                    }
                }
            }
    }
    }
    

    calling method

    Globals.sharedInstance.getUserAddresses{ (issuccess) in
                    // check if success then reload table
           if  issuccess{
            Globals.sharedInstance.user!.addresses.removeAll()
            self.addresses = Globals.sharedInstance.user!.addresses
    
            self.tableView.reloadData()
              }
           }