2017-02-26 12 views
0

TornadoFX에서 수신자가 불필요한 이벤트를 다시 처리하지 못하게하고 메모리 누수와 같은 것을 피할 수 있도록 맞춤 이벤트를 수신 거부하고 싶습니다. 그러나 코드에서 unsubscribe<MyEvent> 메소드를 사용하면 전혀 작동하지 않습니다. 여기 내 코드의 일부입니다 :TornadoFX에서 이벤트 구독을 취소하는 방법은 무엇입니까?

object MyEventObj: FXEvent(EventBus.RunOn.BackgroundThread) 
class MyEventBus(val personlist:List<PersonOld>): FXEvent() 
class MyController: Controller() 
{ 
    init 
    { 
     subscribe<MyEventObj> { 
      unsubscribe<MyEventObj> { 
       println("Unsubscribe event!") //unsubscrib event and make sure the next code just runs once, but never works! 
      } 
      println("Event has received!") 
      val items = listOf(PersonOld("Name A", 20), PersonOld("Name B", 25)) 
      fire(MyEventBus(items)) 
     } 
    } 
} 

그래서, 무엇이 문제입니까? TornadoFX에서 unsubscribe을 어떻게 사용합니까? 사전에 도와 줘서 고마워!

답변

0

unsubscribe 함수는 이벤트 리스너를 매개 변수로 사용합니다. 구독을 취소하려면 리스너를 멤버 val로 저장하여 참조 할 수 있도록해야합니다. 문제가 더 흥미로워지면 청취자 내부에서 this을 참조 할 수 없으므로 수신 거부가 가능하도록 다른 함수를 호출해야합니다. 여기에 완벽한 예입니다

object MyEvent : FXEvent() 

class MyView : View() { 
    override val root = stackpane { 
     paddingAll = 100 
     button("Fire!") { 
      setOnAction { 
       fire(MyEvent) 
      } 
     } 
    } 

    val myListener: (MyEvent) -> Unit = { 
     alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.") 
     stopListening() 
    } 

    init { 
     subscribe(myListener) 
    } 

    fun stopListening() = unsubscribe(myListener) 

} 

그 자체 내에서 청취자를 참조 할 수 있었다면 우리가 수신기 내부에 직접 unsubscribe() 전화를 추가 할 수 있지만 그것은 적어도 코 틀린 1.0, 수 없습니다.

편집 : 구독하기 위해매개 변수를 추가 했으므로 직접 등록 취소를 처리 할 필요가 없습니다. 기본적으로 이벤트 리스너는 이벤트가 발생할 때마다 트리거되지만 1을 전달하면 처음부터 자동으로 등록 취소 할 수 있습니다. TornadoFX 1.6.3에서 오는 새로운 기능과 함께, 당신은 단순히 대신이 작업을 수행 할 수 있습니다

class MyView : View() { 
    override val root = stackpane { 
     paddingAll = 100 
     button("Fire!") { 
      setOnAction { 
       fire(MyEvent) 
      } 
     } 
    } 

    init { 
     subscribe<MyEvent>(times = 1) { 
      alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.") 
     } 
    } 

} 

는 EDIT2 : 당신이 할 수 있도록 TornadoFX 1.6.3 또한, 트리거가 동작하는 EventContext 소개합니다 다음 버전의 이벤트 리스너에서 unsubscribe()을 수행하십시오. 그런 다음 times 매개 변수에 대한 대안으로이 작업을 수행 할 수 있습니다

subscribe<MyEvent> { 
    alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.") 
    unsubscribe() 
} 
+0

은 몇 가지 코드를 추가하고 재 작성하게, 나는 그것을 가지고 마지막에 그! 고마워, 이미 내 테스트 코드에서 작동합니다. – SpkingR

+0

Great :) 보일러 플레이트를 더 줄이기 위해 1.6.3이 출시 된 후에 다시 방문하고 싶을 수도 있습니다. :) –

+0

대단하네요 !! 나는 새로운 버전과 곧 사용할 수있는 새로운 기능을 확인하기 위해 기다릴 수 없어, 마침내 나는 내 방식으로 그것을 사용할 수 있습니다 ... (∩_∩) – SpkingR