我无法在Swift中使用Alamofire返回值

Kai*_*aki 4 swift alamofire

我现在的代码似乎没有返回任何东西,我无法找出导致问题的原因.

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
}
Run Code Online (Sandbox Code Playgroud)

有人知道如何解决我遇到的问题吗?

[更新]:这是状态.

请看第五行和第八行.我无法完成任务的任务.

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)
            })
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

cno*_*oon 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)")
}
Run Code Online (Sandbox Code Playgroud)