【问题标题】:Finding nil for Firebase key from for loop using Swift使用 Swift 从 for 循环中为 Firebase 键查找 nil
【发布时间】:2016-06-26 04:20:59
【问题描述】:

我正在尝试加载一个空数组,以便将用户数据推送到特定的视图控制器。信息保存在 for 循环中并加载到初始视图控制器表视图中。但是在我下面有print(self.usersID)print(self.usersnameArray) 的地方......他们回来时完全是空的。这是我的完整查询和代码....

let userRef = self.ref.childByAppendingPath("users")
        userRef.queryOrderedByPriority().queryLimitedToLast(25).observeEventType(.Value, withBlock: { snapshot in
            if snapshot.value is NSNull
            {
                print("Wait For More Users")
            }
            for items in snapshot.value as! NSDictionary
            {
                let ids = items.key
                let names = items.value["displayName"] as! String
                let csnames = items.value["caseUsername"] as! String
                let pics = items.value["image"] as! NSString

                self.caseUserNameArray.append(csnames)
                self.usersID.append(ids as! String)
                self.usernameArray.append(names)
                self.photos.append(pics)
            }
            self.friendsTBLVW.reloadData()
        })
        print(self.usersID)
        print(self.usernameArray)

有什么热门的想法可以让我的数组追加持续存在吗?

【问题讨论】:

    标签: ios arrays swift firebase append


    【解决方案1】:

    该方法在后台运行,因此它会立即返回,并且您的打印语句会在填充数组之前执行。您需要将它们移动到块内:

    let userRef = self.ref.childByAppendingPath("users")
            userRef.queryOrderedByPriority().queryLimitedToLast(25).observeEventType(.Value, withBlock: { snapshot in
                if snapshot.value is NSNull
                {
                    print("Wait For More Users")
                }
                for items in snapshot.value as! NSDictionary
                {
                    let ids = items.key
                    let names = items.value["displayName"] as! String
                    let csnames = items.value["caseUsername"] as! String
                    let pics = items.value["image"] as! NSString
    
                    self.caseUserNameArray.append(csnames)
                    self.usersID.append(ids as! String)
                    self.usernameArray.append(names)
                    self.photos.append(pics)
                }
                self.friendsTBLVW.reloadData()
                print(self.usersID)
                print(self.usernameArray)
        })
    

    顺便说一下,reloadData 会更新 UI,所以它必须在主线程上运行。例如:

    dispatch_async(dispatch_get_main_queue(), {
        self.friendsTBLVW.reloadData()
    })
    

    【讨论】:

    • 是的,我让它们在块内成功打印。他们最终不会保存到公共数组usersIDusernameArray 或其他数组。问题是....如何让它们公开保存,以便我可以将它们放在 prepareForSegue 中并将此信息移动到另一个视图控制器。
    • 如果您在块内成功打印self.usersID,但在块外它是空的,这可能意味着您在块完成之前在块外访问它们。
    • 是的,迈克尔,你建议做什么?
    • 如果您要独立于 segue 获取此数据,则需要在查询完成之前不允许 segue 发生,或者在 reloadData 之后允许它发生(使用空数组) ,在目标控制器上调用一个函数,以便它可以刷新(现在使用非空数组)。或者,如果此代码是 prepareForSegue 的一部分,您可以在查询完成后使用 peformSegue 摆脱自动 segue 和手动 segue(尽管这可能会显得滞后)。
    • 我真的认为它是“for 循环”问题或 Firebase 查询问题。即使我尝试在不起作用的 for 循环之外重新加载我的表格视图。有谁知道为什么我的信息在括号外消失了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2018-07-01
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多