2016-03-06 2 views
0

довольно новый при стремительном движении. В настоящее время у меня есть программа, где одним нажатием кнопки я делаю запрос 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 часов, пытаясь понять, почему он не работает.

+1

Вы уверены, что получаете информацию о синхронизации/асинхронном режиме? API NSURLSession отличается высокой асинхронностью. таким образом, вы должны перейти от кода, а не от кнопки в обработчике завершения nsurlsessions –

+0

, вы добавили segue в stryboard из UIButton в контроллер представления назначения? –

+0

Да, в этом была проблема - я установил segue с кнопки на контроллер точки назначения. Я должен был установить его со всего контроллера. – b0b0

ответ

1

Добавить сегу из контроллера вида (а не из UIButton) в раскадровку. И назовите его как хотите (идентификатор раскадровки). Выполняйте segue программно с помощью функции performSegue (...) после анализа данных.

+0

Ничего себе, как это не перешло мне в голову. Вот и все. Огромное спасибо. – b0b0

+0

Рад, что я могу помочь –