我一直在浏览StackOverflow问题,试图找出我的代码出错的地方,但我似乎无法做到!我正在尝试将我的Swift 1.2项目转换为Swift 2.0,并且在我的类中遇到了下载JSON数据的问题。
我不断收到错误 void函数中的意外非空返回值。
以下是我正在使用的代码,有点截断;
git rebm featbranch releasebranch
... standard git output ...
featbranch: exit: command not found
fatal: While expanding alias 'rebm': 'sh -c 'echo rebasing branch "$0" on top of "$1" && git checkout "$0" && git pull origin "$0" && git rebase "$1" && git checkout "$1" && git merge "$0" && echo all done && exit 1'': No such file or directory
也许我忽视了一些简单的事情,但我不确定为什么我的功能会被视为无效。任何想法都会非常感激!谢谢!
答案 0 :(得分:55)
你遇到问题,因为你的行:
return minions
不会从您的函数返回。相反,它从dataTaskWithRequest
中的完成处理程序返回。它不应该这样做,因为闭包是一个无效函数。
您遇到的问题是dataTaskWithRequest
是异步操作。这意味着它可以在执行函数后稍后返回。
所以,你需要改变你的设计模式。
这样做的一种方法如下:
static var minions:[Minion] = [] {
didSet {
NSNotificationCenter.defaultCenter().postNotificationName("minionsFetched", object: nil)
}
}
class func fetchMinionData() {
var myURL = "http://myurl/test.json"
let dataURL = NSURL(string: myURL)
let request = NSURLRequest(URL: dataURL!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0)
let session = NSURLSession.sharedSession()
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
let minionJSON = JSON(data!)
var minions = [Minion]()
for (_, minionDictionary) in minionJSON {
minions.append(Minion(minionDetails: minionDictionary))
}
self.minions = minions
//THIS IS WHERE THE ERROR OCCURS
}).resume()
}
然后在调用您的函数之前,您应该注册以侦听名为“minionsFetched”的NSNotification
。只有在你收到通知后,才应该处理仆从,就好像它们被取出一样。
答案 1 :(得分:21)
我通过创建一个完成处理程序来修复我的。您可以这样做而不是使用通知:
class func fetchMinionData(completionHandler: (minions: [Minion]) -> Void) {
var myURL = "http://myurl/test.json"
let dataURL = NSURL(string: myURL)
let request = NSURLRequest(URL: dataURL!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0)
let session = NSURLSession.sharedSession()
session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
let minionJSON = JSON(data!)
var minions = [Minion]()
for (_, minionDictionary) in minionJSON {
minions.append(Minion(minionDetails: minionDictionary))
}
completionHandler(minions: minions)
//THIS IS WHERE YOUR PREVIOUS ERROR OCCURRED
}).resume()
}