Reputation: 2735
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
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
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