【问题标题】:Swift Closure Issue快速关闭问题
【发布时间】:2016-11-09 00:44:04
【问题描述】:

我只是在 Swift 中进行黑客攻击,但对于我的生活而言,除了一个空的 [Item] 之外,我无法将其发送给 return[Item] 是正确的,如果我在闭包内执行 print 函数,也是我想要的方式。

func getCurrentDetails(ref: FIRDatabaseReference) -> [Item] {
    ref.observeEventType(.Value, withBlock: { snapshot in
        var currentDetails = [Item]()
        for item in snapshot.children {
            var currentItem = Item(snapshot: item as! FIRDataSnapshot)
            if currentItem.Name != "" { 
                currentItem.Image = "http://www.deletedthisurl/" + currentItem.Number + "_500X500.gif"
                currentDetails.append(currentItem)   
            }   
        }
        self.currentArray = currentDetails
        // print(self.currentArray)  // Prints here
    })
    print(self.currentArray)  //Prints an empty Item array here
    return currentArray
}

【问题讨论】:

  • 可能是并发问题。声明块与执行它不同。您的打印语句很可能在块代码运行之前发生。
  • 嗯。打印出来的 self.currentArray 反映了闭包体的变化..
  • 啊……我明白了。
  • 一般来说,不要将 Firebase 事件视为函数。通常最好不要这样对待它们(即不要尝试返回值,因为这不是它们的用途)。例如,加载一个数组来填充一个 tableView:使用 for child in snapshot.children{} 遍历快照,然后在该 for 循环中处理每个子项 - 例如将数据添加到数组.然后当循环完成时,调用 tableView.reloadData()。将所有代码保留在块中。如果您想在填充数组数据后对其执行某些操作,请从 块内调用下一步。

标签: swift firebase closures firebase-realtime-database


【解决方案1】:

由于对 firebase 的调用是异步的,因此您将无法返回该值。

要处理它,您可以使用完成处理程序。

func getCurrentDetails(ref: FIRDatabaseReference, completion:(currentArray:[Item])->()) {
    ref.observeEventType(.Value, withBlock: { snapshot in
        var currentDetails = [Item]()
        for item in snapshot.children {
            var currentItem = Item(snapshot: item as! FIRDataSnapshot)
            if currentItem.Name != "" { 
                currentItem.Image = "http://www.deletedthisurl/" +
                    currentItem.Number + "_500X500.gif"
                currentDetails.append(currentItem)   
            }   
        }
        self.currentArray = currentDetails
        completion(currentArray)
    })
}

打电话时你应该做以下事情:

var newVar
getCurrentDetails(ref) { (currentArray) in
    newVar = currentArray
}

【讨论】:

  • 感谢您的帮助!如果我遇到任何问题,我会尝试。我最后只是编写了另一个函数并将 self.currentArray 作为参数传入。
  • @TM 对,但我敢肯定,通过我的回答,您可以在调用函数时获取数组:)
  • 通过在块中填充类数组 self.array,它会在块完成时填充,因此无需将其传递给完成处理程序,因为它是已经有人了。
  • @Jay 当然是 jay,但由于他的意图是在调用该方法时返回它,所以我专注于提供帮助。不确切知道他的用例。
  • 那么有没有办法从 getCurrentDetails 函数中返回 currentArray 呢? var test = getCurrentDetails(ref) {(currentArray in print(CurrentArray)} ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多