довольно новый при стремительном движении. В настоящее время у меня есть программа, где одним нажатием кнопки я делаю запрос NSURL, беру этот ответ, разбираю XML и сохраняю нужные мне данные в массиве [String]. Нажатие этой кнопки также выполняет функцию segue в контроллер табличного представления, который будет динамически заполняться информацией из массива.Swift - Segue не верны правильные данные
Что я вижу, так это то, что происходит segue, и следующий VC передается пустым массивом до того, как мой запрос будет завершен, и будет проанализирован ответ. (все это основано на операторах печати, которые я вставил практически в каждую другую строку, чтобы отслеживать выполнение моего кода).
Как я могу это сделать, так что segue не приведет меня к следующему VC, пока мой ответ не будет разобран?
class start: UIViewController, NSURLConnectionDelegate, NSXMLParserDelegate {
var timeArr:[String] = []
var url = "myurl.com"
@IBOutlet weak var get2: UIButton!
@IBAction func getAction(sender: UIButton) {
var request = NSMutableURLRequest(URL: NSURL(string: url)!)
httpGet (request) {
(data, error) -> Void in
if error != nil {
print(error)
mainInstance.arrivalArr.append("no arrival times")
} else {
self.beginParsing()
print(data)
}
}
}
func httpGet(request: NSURLRequest!, callback: (String, String?) -> Void) {
var session = NSURLSession.sharedSession()
var task = session.dataTaskWithRequest(request){
(data, response, error) -> Void in
if error != nil {
callback("", error!.localizedDescription)
} else {
var result = NSString(data: data!, encoding:
NSUTF8StringEncoding)!
self.data2 = data!
callback(result as String, nil)
}
}
task.resume()
}
func beginParsing()
{
posts = []
parser = NSXMLParser(data: data2)
parser.delegate = self
parser.parse()
}
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
{
element = elementName
if (elementName as NSString).isEqualToString("prd")
{
// more code
}
}
func parser(parser: NSXMLParser, foundCharacters string: String)
{
if element.isEqualToString("prdtm") {
//code
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
{
if (elementName as NSString).isEqualToString("prd") {
if !title1.isEqual(nil) {
//code
}
//code
finalTimeStr = getTime(finalTimeStr)
timeArr.append(finalTimeStr)
}
}
func getTime (time: String) -> String{
var arrivalTime = time
//code to trim and format time here
var timeA = getTimeDiff(arrivalTime)
timeA = trimToMin(timeA)
return timeA
}
func trimToMin (timeToTrim : String) -> String {
var timeInMin = timeToTrim
//code to trim to minutes
return substring2
}
func getTimeDiff (time: String) -> String{
//code to find time difference
let ret = stringFromTimeInterval(diff)
return ret
}
func stringFromTimeInterval(interval: NSTimeInterval) -> String {
//code to format interval
return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let CDview = segue.destinationViewController as? ListView {
CDview.timeArr = timeArr
//CDview.timeArr = mainInstance.arrivalArr
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(animated: Bool) {
timeArr = testArr
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
} Не уверен, куда я пошел неправильно. Это особенно запутанно, потому что, если я использую жестко закодированные строки и прыгаю прямо в getTimeDiff, тогда он отлично работает, и мой вид таблицы на следующем VC также выглядит великолепно. Поблагодарили бы за любую помощь. Я буквально переместил этот код в течение последних 12 часов, пытаясь понять, почему он не работает.
Вы уверены, что получаете информацию о синхронизации/асинхронном режиме? API NSURLSession отличается высокой асинхронностью. таким образом, вы должны перейти от кода, а не от кнопки в обработчике завершения nsurlsessions –
, вы добавили segue в stryboard из UIButton в контроллер представления назначения? –
Да, в этом была проблема - я установил segue с кнопки на контроллер точки назначения. Я должен был установить его со всего контроллера. – b0b0