Firebase

Firebase(IOS) - 데이터 읽기 동기 처리.

clamp 2022. 7. 21. 17:42

파이어 베이스의 데이터를 읽는 코드는 비동기 방식으로 처리된다.

만약 파이어베이스에서 데이터를 읽는 코드를 작성하고 바로 프린트를 해보면 값은 변경되지 않고 그대로 출력될것이다.

이런식으로

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내부는 비동기처리 되지만 내부의 코드들은 하나의 코드로 동기적 처리가된다.

읽어오고 호출부에서 컴플리션 핸들러로 넘겨주면 된다.