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

时间:2015-02-17 15:21:08

标签: 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
}

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

[更新] :这是状态。

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

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)
            })
    }
}

感谢。

3 个答案:

答案 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)  #=> ()
                })
        }
}