我目前的代码似乎没有返回任何内容,我无法找出导致问题的原因。
func getQuests(category: NSString, count: Int) -> NSArray {
var quests = NSArray()
Alamofire.request(.GET, apiUrlString, parameters: ["category": category, "count": count])
.responseJSON { (request, response, json, error) in
dispatch_async(dispatch_get_main_queue(), {
quests = json as NSArray
})
}
println(quests) #=> ()
return quests
}
有人知道如何解决我遇到的问题吗?
[更新] :这是状态。
请看第五行和第八行。 我无法完成任务的任务。
var quests = NSArray()
getQuests("normal", count: 30, completionHandler: {
quests in
self.quests = quests
})
println(self.quests) #=> ()
func getQuests(category: NSString, count: Int, completionHandler: (NSArray -> Void)) {
var quests = NSArray()
Alamofire.request(.GET, apiUrlString, parameters: ["category": category, "count": count])
.responseJSON { (request, response, json, error) in
dispatch_async(dispatch_get_main_queue(), {
quests = json as NSArray
completionHandler(quests)
})
}
}
感谢。
答案 0 :(得分:6)
其他答案肯定是正确的,并且遇到了许多与异步操作相关的问题。我只是想补充dispatch_async(dispatch_get_main_queue())
电话不必要的事实。
这已经在Alamofire内部自动完成。 Alamofire处理内部委托调度队列上的所有操作。完成所有这些操作(验证,响应序列化等)后,默认情况下会在主调度队列上调用完成处理程序闭包。这使得dispatch_async
不必要,应该删除。
如果您愿意,您也可以在自己提供的调度队列上运行完成处理程序,但这肯定是一个不适用于此用例的高级功能。
这是一个相同逻辑的更简洁版本。
let apiUrlString = "some/url/path"
func getQuests(#category: NSString, count: Int, completionHandler: (NSArray) -> Void) {
Alamofire.request(.GET, apiUrlString, parameters: ["category": category, "count": count])
.responseJSON { _, _, json, _ in
completionHandler(json as NSArray)
}
}
var myQuests: NSArray?
getQuests(category: "normal", count: 30) { quests in
myQuests = quests
println("My Quests: \(myQuests)")
}
答案 1 :(得分:3)
在函数内部进行异步工作时,无法按照您的意愿返回值。 在其中包含异步部分的函数通常允许您传入"完成处理程序",这将在异步任务完成后执行。
在你的情况下,这意味着,你必须改变你的功能" getQuests"比如这样:
func getQuests(category: NSString, count: Int, completionHandler: (NSArray -> Void)) {
Alamofire.request(.GET, apiUrlString, parameters: ["category": category, "count": count])
.responseJSON { (request, response, json, error) in
dispatch_async(dispatch_get_main_queue(), {
let quests = json as? NSArray
// pass the array of quests, or an empty array to your completionHandler
completionHandler(quests ?? [])
})
}
}
然后你可以从某个地方调用这个函数并传入完成处理程序,在那里你可以检索任务:
getQuests("Easy", count: 5, completionHandler: {
quests in
println(quests)
})
希望这能让你开始。
答案 2 :(得分:-1)
您需要在任务中为任务创建一个属性,以便您可以在异步回调中访问它。
var quests = NSArray()
您无法返回数组,因为它是异步的。只需删除返回类型。当回调触发时,将结果保存到数组中,并执行您想要发生的任何其他操作。
func getQuests(category: NSString, count: Int) {
Alamofire.request(.GET, apiUrlString, parameters: ["category": category, "count": count])
.responseJSON { (request, response, json, error) in
dispatch_async(dispatch_get_main_queue(), {
self.quests = json as NSArray
println(self.quests) #=> ()
})
}
}