Reputation: 254
I'm a newbie in IOS and i'm in small project. In my project i have to load data from Webservice (SOAP) in main controller -> put Data to seacond controller. So, maybe the data load in background thread, the method put data run before the load method. So how i can fix it? this is my code:
class MainRevealController: SWRevealViewController {
var conectData:ConnectData = ConnectData()
var menuTitle:[String] = []
var menuIcon:[String] = []
override func viewDidLoad() {
super.viewDidLoad()
self.conectData.DemoSVNew("", key: "", commandType: "Menu", version: "") { (stringData) in
print("Hello I'm Loading Data")
let dataArray = stringData.componentsSeparatedByString("|")
let decodedData = NSData(base64EncodedString: dataArray[2], options: NSDataBase64DecodingOptions(rawValue: 0))
let decodedString = NSString(data: decodedData!, encoding: NSUTF8StringEncoding)
let dataArr = decodedString!.componentsSeparatedByString("<row>")
for i in 0...dataArr.count-1 {
let menu = dataArr[i].componentsSeparatedByString("|")
self.menuTitle.append(menu[3])
self.menuIcon.append(menu[4])
}
print("LoadData :",self.menuIcon.count)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "sw_rear" {
let mSegue = segue.destinationViewController as! MenuController
mSegue.menuTitle = menuTitle
mSegue.menuIcon = menuIcon
print("icon :",self.menuIcon.count)
print("title :",self.menuIcon.count)
}
}
Upvotes: 2
Views: 459
Reputation: 13600
Make following changes in MainRevealController
.
class MainRevealController: SWRevealViewController {
override func viewDidLoad() {
super.viewDidLoad()
// *** Removed your API call from here as before it returns result you are on `MenuController` ***
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "sw_rear" {
let mSegue = segue.destinationViewController as! MenuController
// *** No need to pass data here, as your data is loaded in `MenuController` itself ***
}
}
}
and following changes in MenuController
.
class MenuController {
var conectData:ConnectData = ConnectData()
var menuTitle:[String] = []
var menuIcon:[String] = []
override func viewDidLoad() {
super.viewDidLoad()
// *** Call your API here for menu items and perform action on result ***
self.conectData.DemoSVNew("", key: "", commandType: "Menu", version: "") { (stringData) in
print("Hello I'm Loading Data")
let dataArray = stringData.componentsSeparatedByString("|")
let decodedData = NSData(base64EncodedString: dataArray[2], options: NSDataBase64DecodingOptions(rawValue: 0))
let decodedString = NSString(data: decodedData!, encoding: NSUTF8StringEncoding)
let dataArr = decodedString!.componentsSeparatedByString("<row>")
for i in 0...dataArr.count-1 {
let menu = dataArr[i].componentsSeparatedByString("|")
self.menuTitle.append(menu[3])
self.menuIcon.append(menu[4])
}
print("LoadData :",self.menuIcon.count)
// *** Do somethign with your API result ***
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
I hope its clear to you now. Happy coding :)
Upvotes: 2