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