从observeSingleEvent返回两个数组

时间:2017-04-28 05:03:28

标签: swift firebase-realtime-database

我在Firebase实时数据库中有问题和答案,我需要将其下载并放入阵列。我创建了一个带参数的函数,它应该返回两个数组

let data = fetchQuestions(category: "Animals")
qAni = data.ques
aAni = data.ans

fetchQuestions方法:

func fetchQuestions(category: String) -> (ques: [String], ans: [String]) {
        var q = [String]()
        var a = [String]()
        ref.child("QA/Category").observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? [String: Any]
            for (k, v) in value! {
                if k == category {
                    let QA = v as! NSArray
                    for i in QA {
                        let question = i as! [String: String]
                        q.append(question["question"]!)
                        a.append(question["answer"]!)
                    }
                    return (q, a)  ** Unexpected non-void return value in void function
                }
            }
        })
    }

我曾尝试使用调度组,但后来收到了不同的错误。

2 个答案:

答案 0 :(得分:2)

您目前正在observeSingleEvent的完成区返回,其返回类型为void,您需要使用completionHandler创建fetchQuestions。现在使用Swift而不是使用NSArray使用Swift本机数组。另外,不是维护两个数组,而是使用struct或class的自定义对象维护一个数组。

首先像这样创建一个struct

struct Category {
    let question: String
    let answer: String
}

现在以这种方式使用fetchQuestions制作completionHandler。

func fetchQuestions(category: String, completion: @escaping([Category]) -> Void) {
    var array = [Category]
    ref.child("QA/Category").observeSingleEvent(of: .value, with: { (snapshot) in
        let value = snapshot.value as? [String: Any]
        for (k, v) in value! {
            if k == category {
                let QA = v as! [[String:String]]
                for i in QA {                       
                    let que = i["question"]!
                    let ans = i["answer"]!
                    array.append(Category(question: que, answer: ans))
                }                    
            }
        }
        completion(array)
    })
}

现在以这种方式致电fetchQuestions

self.fetchQuestions(category: "Animals") { categories in
    //access categories here
    print(categories)
}

注意:您可以使用queryEqual(toValue:)与您的请求一起使用if来获取特定结果,而不是查看此SO thread的详细信息。 p>

答案 1 :(得分:0)

因为你从一个闭包中返回一个值而你应该使用不同的闭包。试试吧:

func fetchQuestions(category: StringcompletionBlock:@escaping (_ ques:[String], _ ans :[String]) -> ()) {
    var q = [String]()
    var a = [String]()
    ref.child("QA/Category").observeSingleEvent(of: .value, with: { (snapshot) in
        let value = snapshot.value as? [String: Any]
        for (k, v) in value! {
            if k == category {
                let QA = v as! NSArray
                for i in QA {
                    let question = i as! [String: String]
                    q.append(question["question"]!)
                    a.append(question["answer"]!)
                }

            }
          return completionBlock(q,a)
        }
    })
}
  

@escaping是必需的:当闭包作为参数传递给。时   函数,但在函数返回后调用。