2017-12-18 5 views
1

두 클래스가 서로 필요하다고 가정 해 봅시다.신속한 순환 의존성 해결

class LoginInteractor { 

    let userInteractor: UserInteractor 

    init(userInteractor: UserInteractor) { 
     self.userInteractor = userInteractor 
    } 

} 

class UserInteractor { 
    let loginInteractor: LoginInteractor 

    init(loginInteractor: LoginInteractor) { 
     self.loginInteractor = loginInteractor 
    } 
} 

내가 시도하면 (let loginInteractor = LoginInteractor()) 원형 종속성을 얻습니다. 이 문제를 어떻게 해결합니까?

+0

다른 클래스를 만들려면 각 클래스가 필요합니다. 그건 안돼. 적어도 두 가지 중 하나는 다른 하나의 초기 필요없이 만들 수 있도록해야합니다. – rmaddy

+0

@ rmaddy의 덧글에 덧붙이 자면, 이렇게하는 한 가지 방법은 nil이 의미있는 값인 의미론이 필요하지만 속성 중 하나를 선택적으로 만드는 것입니다. – Grimxn

답변

2

두 클래스의 이니셜 라이저에 다른 클래스에 대한 참조가 필요한 경우 두 클래스를 가질 수 없습니다. 단순히 불가능합니다.

클래스 중 하나 이상을 변경하여 다른 클래스가 필요없는 초기화 프로그램이 필요합니다.

그런 다음 상대방에 대한 강력한 참조가있는 문제도 있습니다. 이로 인해 참조주기 (메모리 누수의 한 형태)가 발생합니다. 따라서 이니셜 라이저 중 하나를 변경하는 것 외에도 참조 중 하나를 약하게해야합니다.

결국 결국 다른 부모 - 자식 클래스 참조와 비슷하게 만들 필요가 있습니다.

UserInteractorLoginInteractor이 필요하지 않도록 업데이트하는 것이 좋습니다. 한 가지 가능한 경우 만 로그인하면 여러 가지 일을하는 사용자가있을 수 있습니다. 당신이 UserInteractor의 인스턴스를 만들 수 있습니다이 설정으로

class UserInteractor { 
    weak var loginInteractor: LoginInteractor? 

    init() { 
    } 
} 

class LoginInteractor { 
    let userInteractor: UserInteractor { 
     didSet { 
      userInterator.loginInteractor = self 
     } 
    } 

    init(userInteractor: UserInteractor) { 
     self.userInteractor = userInteractor 
    } 
} 

. UserInteractor 인스턴스를 사용하여 LoginInteractor의 인스턴스를 만들 수 있습니다.

let userInteractor = UserInteractor() 
let loginIteractor = LoginInteractor(userInteractor: userInteractor) 
+0

다음 시나리오를 상상해보십시오 : 사용자가 주어진 loginInteractor와 암호가 UserInteractor.saveLoggedUser를 사용하여이 사용자를 저장하면 요청을합니다. 이제 사용자가 이미 로그인 한 경우 앱이 시작될 때마다 UserInteractor.updateProfile()을 수행하지만 세션이 만료되어 오류가 발생하고 내부에서 LoginInteractor.login (storedCredentails)을 수행해야 할 때를 상상해보십시오. UserInteractor, 그리고 당신은 loginInteractor를 조롱하여 실제로 프로파일을 업데이트하는 오류가 발생했는지 확인하기위한 테스트를하고 싶습니다. – Godfather

+0

어쨌든 저는 솔루션을 사용할 수 있습니다. – Godfather