MRizwan33
MRizwan33

Reputation: 2735

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.

Upvotes: 0

Views: 247

Answers (2)

KKRocks
KKRocks

Reputation: 8322

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()
          }
       }

Upvotes: 0

KKRocks
KKRocks

Reputation: 8322

you need to reload data inside the block

RestApiManager.sharedInstance.makePostRequest(vc:self, url: url, post:params, successCompletionHandler:{
            (data) in
            self.addresses.removeAll() // array of addresses
           Globals.sharedInstance.user!.addresses.removeAll()
           Globals.sharedInstance.getUserAddresses = data // you need to assign your data it is for suggestion only
           Globals.sharedInstance.getUserAddresses(vc: self)
          self.addresses = Globals.sharedInstance.user!.addresses
        self.tableView.reloadData()
        }, failureCompletionHandler:{(data) in })

Upvotes: 1

Related Questions