Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 试图使用完成处理程序从google firebase获取数据时遇到问题_Swift_Firebase_Swift3_Firebase Realtime Database_Completionhandler - Fatal编程技术网

Swift 试图使用完成处理程序从google firebase获取数据时遇到问题

Swift 试图使用完成处理程序从google firebase获取数据时遇到问题,swift,firebase,swift3,firebase-realtime-database,completionhandler,Swift,Firebase,Swift3,Firebase Realtime Database,Completionhandler,我正在尝试为firebase数据库中的某些数据创建一个完成处理程序。我试图使用while循环,但什么都没有发生。代码如下: func ifUserIsMember(counter: Int, completionHandler: @escaping ((_ exist : Bool) -> Void)) { let ref = FIRDatabase.database().reference() ref.child("Test").child("\(counter)").

我正在尝试为firebase数据库中的某些数据创建一个完成处理程序。我试图使用while循环,但什么都没有发生。代码如下:

func ifUserIsMember(counter: Int, completionHandler: @escaping ((_ exist : Bool) -> Void)) {
    let ref = FIRDatabase.database().reference()

    ref.child("Test").child("\(counter)").observeSingleEvent(of: .value, with: { (snapshot) in
        if snapshot.exists(){
            let value = snapshot.value as? NSDictionary
            test1 = value?["cal1"] as! String
            test2 = value?["cal2"] as! String
            test3 = value?["cal3"] as! String
            completionHandler(true)
        }else{
            print("user is not a member of a team")
            completionHandler(false)
        }
    })
}
//在viewDidLoad中调用此

    var counter = 0
    var ref: FIRDatabaseReference!
    ref = FIRDatabase.database().reference()
        while counter < 6 {
        ifUserIsMember(counter: counter + 1) { (exist) -> () in
            if exist == true {
                print("Found something")

                counter += 1
            }
            else {
                print("NO DATA")
            }
        }
      }
var counter = 0
var ref: FIRDatabaseReference!
ref = FIRDatabase.database().reference()

while counter < 6 {
    ifUserIsMember(counter: counter + 1,
                   completionHandler: { existing in
        if existing {
            print("Found something")
        } else {
            print("NO DATA")
        }
   })

   counter += 1 // or you will have infinite loop
}
var计数器=0
var ref:FIRDatabaseReference!
ref=FIRDatabase.database().reference()
而计数器<6{
中的ifUserIsMember(计数器:计数器+1){(存在)->()
如果存在==true{
打印(“找到某物”)
计数器+=1
}
否则{
打印(“无数据”)
}
}
}

我试图使用while循环来获取所有数据,但它不起作用。它不会从循环中出来并重新开始

我对Firebase不太熟悉,也不确定您到底想完成什么,但是在完成处理程序中更新
计数器
是行不通的

如果在
ifUserIsMemberFunc
的顶部放置一条log语句,例如:
print(“counter:\(counter)”)
,您可能会对输出感到惊讶

如果我正确地阅读了您的代码,您基本上得到了一个无限循环,该循环创建Firebase查询以检查
1
处是否存在子级

如果要并行运行这些查询,则需要将
计数器+=1
放在完成块的外部。但是,您需要等待所有查询完成。(
DispatchGroup
是一个不错的选择。)


如果你想做其他事情,还有其他选择。希望这有帮助

我对Firebase不是很熟悉,我也不确定您到底想完成什么,但是在完成处理程序中更新
计数器
是行不通的

如果在
ifUserIsMemberFunc
的顶部放置一条log语句,例如:
print(“counter:\(counter)”)
,您可能会对输出感到惊讶

如果我正确地阅读了您的代码,您基本上得到了一个无限循环,该循环创建Firebase查询以检查
1
处是否存在子级

如果要并行运行这些查询,则需要将
计数器+=1
放在完成块的外部。但是,您需要等待所有查询完成。(
DispatchGroup
是一个不错的选择。)


如果你想做其他事情,还有其他选择。希望这有帮助

添加一些代码。应该有用

 func ifUserIsMember(counter: Int, completionHandler: @escaping (_ exist : Bool) -> Void)) {
     let ref = FIRDatabase.database().reference()

     ref.child("Test").child("\(counter)").observeSingleEvent(of: .value, with: { (snapshot) in
         if snapshot.exists(){
            let value = snapshot.value as? NSDictionary
            test1 = value?["cal1"] as! String
            test2 = value?["cal2"] as! String
            test3 = value?["cal3"] as! String
            completionHandler(true)
        } else {
            print("user is not a member of a team")
            completionHandler(false)
        }
    })
}
//在viewDidLoad中调用此

    var counter = 0
    var ref: FIRDatabaseReference!
    ref = FIRDatabase.database().reference()
        while counter < 6 {
        ifUserIsMember(counter: counter + 1) { (exist) -> () in
            if exist == true {
                print("Found something")

                counter += 1
            }
            else {
                print("NO DATA")
            }
        }
      }
var counter = 0
var ref: FIRDatabaseReference!
ref = FIRDatabase.database().reference()

while counter < 6 {
    ifUserIsMember(counter: counter + 1,
                   completionHandler: { existing in
        if existing {
            print("Found something")
        } else {
            print("NO DATA")
        }
   })

   counter += 1 // or you will have infinite loop
}
var计数器=0
var ref:FIRDatabaseReference!
ref=FIRDatabase.database().reference()
而计数器<6{
ifUserIsMember(计数器:计数器+1,
completionHandler:{中存在
如果存在{
打印(“找到某物”)
}否则{
打印(“无数据”)
}
})
计数器+=1//否则将有无限循环
}
如果要加载对象数组,例如tableView,则应使用完成处理程序生成另一个one函数。差不多

// for example it will return [String]
func getAllObjects(completion: (_ hasFinished: [String]) -> Void) {
    var arrayToReturn = [String]()
    var countOfChecked = 0 
    while counter < 6 {
         ifUserIsMember(counter: counter + 1,
                        completionHandler: { existing in
             var countOfChecked += 1
             if existing {
                 print("Found something")
                 arrayToReturn(//append some data)
                 if countOfChecked == 6 { // its your number (6)
                     completion(arrayToReturn)
                 }
             } else {
                 print("NO DATA")
             }
         })

         counter += 1 // or you will have infinite loop
    }
}
//例如,它将返回[String]
func getAllObject(完成:(hasFinished:[字符串])->Void){
var arrayToReturn=[String]()
var countOfChecked=0
而计数器<6{
ifUserIsMember(计数器:计数器+1,
completionHandler:{中存在
var countOfChecked+=1
如果存在{
打印(“找到某物”)
arrayToReturn(//追加一些数据)
如果countOfChecked==6{//那是你的号码(6)
完成(返回)
}
}否则{
打印(“无数据”)
}
})
计数器+=1//否则将有无限循环
}
}
像这样的。你应该明白这一点


希望它能对您的代码有所帮助。应该有用

 func ifUserIsMember(counter: Int, completionHandler: @escaping (_ exist : Bool) -> Void)) {
     let ref = FIRDatabase.database().reference()

     ref.child("Test").child("\(counter)").observeSingleEvent(of: .value, with: { (snapshot) in
         if snapshot.exists(){
            let value = snapshot.value as? NSDictionary
            test1 = value?["cal1"] as! String
            test2 = value?["cal2"] as! String
            test3 = value?["cal3"] as! String
            completionHandler(true)
        } else {
            print("user is not a member of a team")
            completionHandler(false)
        }
    })
}
//在viewDidLoad中调用此

    var counter = 0
    var ref: FIRDatabaseReference!
    ref = FIRDatabase.database().reference()
        while counter < 6 {
        ifUserIsMember(counter: counter + 1) { (exist) -> () in
            if exist == true {
                print("Found something")

                counter += 1
            }
            else {
                print("NO DATA")
            }
        }
      }
var counter = 0
var ref: FIRDatabaseReference!
ref = FIRDatabase.database().reference()

while counter < 6 {
    ifUserIsMember(counter: counter + 1,
                   completionHandler: { existing in
        if existing {
            print("Found something")
        } else {
            print("NO DATA")
        }
   })

   counter += 1 // or you will have infinite loop
}
var计数器=0
var ref:FIRDatabaseReference!
ref=FIRDatabase.database().reference()
而计数器<6{
ifUserIsMember(计数器:计数器+1,
completionHandler:{中存在
如果存在{
打印(“找到某物”)
}否则{
打印(“无数据”)
}
})
计数器+=1//否则将有无限循环
}
如果要加载对象数组,例如tableView,则应使用完成处理程序生成另一个one函数。差不多

// for example it will return [String]
func getAllObjects(completion: (_ hasFinished: [String]) -> Void) {
    var arrayToReturn = [String]()
    var countOfChecked = 0 
    while counter < 6 {
         ifUserIsMember(counter: counter + 1,
                        completionHandler: { existing in
             var countOfChecked += 1
             if existing {
                 print("Found something")
                 arrayToReturn(//append some data)
                 if countOfChecked == 6 { // its your number (6)
                     completion(arrayToReturn)
                 }
             } else {
                 print("NO DATA")
             }
         })

         counter += 1 // or you will have infinite loop
    }
}
//例如,它将返回[String]
func getAllObject(完成:(hasFinished:[字符串])->Void){
var arrayToReturn=[String]()
var countOfChecked=0
而计数器<6{
ifUserIsMember(计数器:计数器+1,
completionHandler:{中存在
var countOfChecked+=1
如果存在{
打印(“找到某物”)
arrayToReturn(//追加一些数据)
如果countOfChecked==6{//那是你的号码(6)
完成(返回)
}
}否则{
打印(“无数据”)
}
})
计数器+=1//否则将有无限循环
}
}
像这样的。你应该明白这一点


希望有帮助

您能共享数据库结构吗?您能共享数据库结构吗?