【发布时间】:2014-06-24 18:50:58
【问题描述】:
我在尝试使用 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: &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)");
}
【问题讨论】:
-
数组很强大。如果您仍然拥有阵列,那么您仍然拥有放入其中的任何东西。您在 dataTaskWithURL 上有一个完成块,您可以在其中添加一些内容到 exchangeArray。这真的叫过吗? if 语句是真的吗?在
self.exchangeArray.append(tempExchange);上打断点查看。 -
你是说数组不保存值是因为最后一个
println("\(exchangeArray.count)")打印一个零吗? -
是的,它在最后一次调用时打印 0,我需要数组来保存数据,而不是发送给委托人。