개발/Swift

Rxswift combineLatest 에러 The compiler is unable to type-check this expression in reasonable time

덤벨로퍼 2023. 7. 1. 13:47
The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions

Rx - combine latest 에 9개 이상의 observable을 넣었더니 에러가 발생

CombineLatest를 쓸떄 8개까지만 쓸수가 있다

이를 해결하기위해 여러 더많은 Observable을 쓰려면

combine 을 하고 그거를 가지고 combine 해줘야한다.

let searchCombinedObservable = Observable.combineLatest(searchKeyword.asObservable(),
                                                        eFriendList.asObservable(),
                                                        eFriendsPageFinished.asObservable())

combine = Observable.combineLatest(aFriendList.asObservable(),
                                        aFriendExpand.asObservable(),
                                        bFriendList.asObservable(),
                                        cFriendList.asObservable(),
                                        dFriendsPageFinished.asObservable(),
                                        showOnlyFamily.asObservable(),
                                        searchCombinedObservable)

이렇게 묶어버리면 된다.

 

문제는 map 으로 떨어진 데이터가 튜플 형태로 떨어지기 때문에

0 , 1, 2 로 접근이 가능하다.

let searchCombinedObservable = Observable.combineLatest(searchKeyword.asObservable(),
                                                        eFriendList.asObservable(),
                                                        eFriendsPageFinished.asObservable())

combine = Observable.combineLatest(aFriendList.asObservable(),
                                        aFriendExpand.asObservable(),
                                        bFriendList.asObservable(),
                                        cFriendList.asObservable(),
                                        dFriendsPageFinished.asObservable(),
                                        showOnlyFamily.asObservable(),
                                        searchCombinedObservable)
                                        
        .map { aFriendList, aFriendExpand, bFriendList,
            cFriendList, cFriendsPageFinished, showOnlyFamily, searchCombine in
            searchCombine.0
            searchCombine.1
            searchCombine.2 //이렇게 접근해야해서 가독성이 좋지 않음

        }

그랬을떄 가독성이 좋지 않으므로 combine 된 튜플을 네이밍 해주면 좋다.

let searchCombinedObservable = Observable.combineLatest(searchKeyword.asObservable(),
                                                        eFriendList.asObservable(),
                                                        eFriendsPageFinished.asObservable())

combine = Observable.combineLatest(aFriendList.asObservable(),
                                        aFriendExpand.asObservable(),
                                        bFriendList.asObservable(),
                                        cFriendList.asObservable(),
                                        dFriendsPageFinished.asObservable(),
                                        showOnlyFamily.asObservable(),
                                        searchCombinedObservable)
                                        
        .map { aFriendList, aFriendExpand, bFriendList,
            cFriendList, cFriendsPageFinished, showOnlyFamily, searchCombine in
            let (searchKeyword, eFriendList, eFriendsPageFinished) = searchCombine

            searchKeyword
            eFriendList
            eFriendsPageFinished 

        }