파이어 베이스의 데이터를 읽는 코드는 비동기 방식으로 처리된다.
만약 파이어베이스에서 데이터를 읽는 코드를 작성하고 바로 프린트를 해보면 값은 변경되지 않고 그대로 출력될것이다.
이런식으로
var a = 1
readfirebase() // a가 2로 변경되어야함
print(a)
출력은 1
2로 변경되어야 하는 a는 1로 출력된다.
파이어베이스의 데이터를 받아오는 코드는 비동기적으로 처리되기 때문에 데이터를 읽어온 후 2로 변경되는데
읽어 오기도 전에 프린트를 해버려서 출력이 1이 나온다.
버튼을 만들어서 출력해보면 2로 정상 출력된다.
이렇기 때문에 데이터를 읽어온 직후 그 데이터를 사용해야 한다면 원하지 않는 결과를 얻게된다.
동기처리 하는 방법
데이터 읽는 함수를 호출하는 부분
//데이터 읽기 함수를 호출하는 부분
DispatchQueue.global().async(){
//데이터를 읽는 함수
FirebaseDataRead()
print(a)
}
데이터 읽는 함수 내부
func FirebaseDataRead(){
var run = true
/* 데이터를 읽고 처리하기 시작 */
/* 소스코드 */
/* run = false */
/* 데이터를 읽고 처리를 완료 */
while run{
}
}
DIsptchQueue.global().async()내부의 코드는 비동기적으로 처리됨.
왜인지 정확히는 모르겠다.
비동기 적으로 처리되기 때문에 while은 항상 실행중이여서 무한Loop를 돌게되지만 데이터를 읽어오고 run을 false로 만들어서 그 이후 코드들을 실행시켜 주기 때문인지..
completionHandler의 콜백 방식을 사용하면 된다곤 하지만 지금 내 수준으론 뭐가 뭔지도 감이 안오고..
추가 +
func readFirebase(경로: String, completion: (data) -> ()){
//데이터 읽기 함수를 호출하는 부분
DispatchQueue.global().async(){
//데이터를 읽는 함수
//데이터를 읽어옴
completion(data)
}
}
async내부는 비동기처리 되지만 내부의 코드들은 하나의 코드로 동기적 처리가된다.
읽어오고 호출부에서 컴플리션 핸들러로 넘겨주면 된다.