Массив Swift не содержит значений

#arrays #swift

#массивы #swift

Вопрос:

Я столкнулся со следующей проблемой при попытке создать что-то с помощью Swift. По-видимому, значения, которые я добавил в массив, не сохраняются через какой-то момент. Они отлично отправляются по протоколу во время выполнения задачи, но после ее завершения, если я попытаюсь просмотреть значения в массиве, он возвращает пустой.

Что я делаю не так? Я предполагаю, что он освобождается после завершения задачи. Если это так, есть ли способ сделать его сильным? Есть ли что-то, что я должен знать об этой задаче? Не могли бы вы объяснить мне, как это работает и что я должен делать?

Вот код:

 var exchangeArray : ExchangeValues[] = [];

func fetchResult(){
    var currenciesOrder = ["EUR", "USD", "GBP", "CHF", "NOK", "SEK", "DKK", "CZK","TRY", "BGN", "MDL", "PLN", "XDR", "XAU", "UAH", "RUB", "RSD","CAD", "AUD", "JPY", "EGP", "BRL","HUF", "MXN","KRW", "CNY","NZD","INR","AED", "ZAR"];
    let dateFormat = NSDateFormatter();
    dateFormat.dateFormat = "yyyy-MM-dd";

    for days in 0..2 {

        let daysToSubstract = Double(60*60*24*days);
        let date : String = dateFormat.stringFromDate(NSDate().dateByAddingTimeInterval(-daysToSubstract));

        var url: NSURL = NSURL(string: "http://openapi.ro/api/exchange/all.json?date="   date);
        var session = NSURLSession.sharedSession();
        var task = session.dataTaskWithURL(url, completionHandler: {
            (data, response, error) -> Void in
            if (response != nil){
                var err: NSError?;
                if(err?) {
                    println("request Error (err!.localizedDescription)");
                }
                //send the result to protocol
                let results = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: amp;err) as NSDictionary;

                let temp : NSDictionary = results["rate"] as NSDictionary;

                for key in 0..currenciesOrder.count{

                    for (currencyKey : AnyObject, currencyValue : AnyObject) in temp {
                        if currenciesOrder[key] as String == currencyKey as String {
                            let tempExchange = ExchangeValues(currency: currencyKey as? String, value: currencyValue.doubleValue, date:date );
                            self.exchangeArray.append(tempExchange);
                        }

                    }

                }
                self.delegate?.didReceiveResults(self.exchangeArray);
            } else {
                println("error: (error.localizedDescription)");
            }

        })
        task.resume();
    }

    println("(exchangeArray.count)");
}
  

Комментарии:

1. Массивы являются сильными. Если у вас все еще есть массив, у вас все еще есть все, что вы в него поместили. У вас есть блок завершения в dataTaskWithURL, и именно там вы добавляете что-то в exchangeArray. Это когда-либо вызывалось? И является ли утверждение if когда-либо истинным? Установите точку останова self.exchangeArray.append(tempExchange); , чтобы увидеть.

2. Вы хотите сказать, что массив не содержит значений, потому что последний println("(exchangeArray.count)") выводит ноль?

3. Да, он выводит 0 при последнем вызове, и мне нужен массив для хранения данных после их отправки делегату.

Ответ №1:

Я вроде понял, в чем проблема:

Блок задач возвращает void, поэтому я думаю, что он очищает массив после его завершения. Результатом является создание другой функции, которая вызывается из задачи, где массив работает просто отлично (ему передаются значения, пока они существуют), и любая дальнейшая обработка может быть выполнена там.

Я надеюсь, что это кому-то поможет. Код настолько прост, насколько это:

     func sendResults(array : ExchangeValues[]) -> Void{

    println("(exchangeArray.count)"); }
  

Конечно, вы можете заставить функцию возвращать что-то, если вам нужно.

Комментарии:

1. если вы хотите задать другой вопрос, пожалуйста, создайте новую тему, чтобы не задавать дополнительные вопросы в указанном ответе.