2013-01-17 3 views
0

내가 궁금하고 어떤이 튜토리얼 https://developers.google.com/web-toolkit/articles/mvp-architecture 보고 된이 MVP 스타일이 때마다 사용자가가는 것을 페이지를 변경하고 발표자의 새로운 인스턴스를 생성하는 방법을 효율적으로입니다. 발표자가 싱글 톤이라면 더 좋을까요? 필자의 최종 목표는 PhoneGap을 사용하여 앱을 배포하여 성능 향상이 유용 할 수 있도록하는 것입니다.GWT 예 MVP 응용 프로그램

답변

0

모두 구현에 따라 다릅니다.

상태를보기에 저장하려면 싱글 톤 발표자 /보기로 이동하십시오.

뷰를 초기화 할 필요가 없으므로 효율적입니다. 다른 뷰의 일부 트랜잭션이 첫 번째 뷰를 변경해야하는 경우에는 효율성이 떨어집니다. 이 경우 첫 번째 발표자에게 걸려있는 두 번째 발표자에서 이벤트를 발생시키고 이에 따라보기를 수정해야합니다. 이것은 응용 프로그램을 예측하기 어렵게 만듭니다.

각 발표자 /보기가 독립적 인 경우 단일보기/발표자가해야 할 일입니다.

다른 경우에는보기에서 사용하는 양식의 데이터를 다시 초기화하기 위해 새 발표자 /보기로 이동합니다.

곰은 다음과 같은 문제가 발생할 것입니다 (예 : 이벤트 버스 등) 응용 프로그램 다양한 변수를 사용하여 각각의 새로운 발표자가 파괴되지 않을 것 (쓰레기 수집 된) 비록 마음에 :

모든 시간을 당신이로드 보기와 해당 발표자에 걸린 이벤트가 발생하면 이벤트와 모든 계산이 새 발표자 /보기가 생성 될 때까지 여러 번 발생합니다.

예 : -Presenter1/뷰 1로드하고 -Presenter2/뷰 2가 -Presenter1 (새 인스턴스)/뷰 1 (새로운 인스턴스)를로드 일부 이벤트로드를 잡아 어떤 이벤트를 잡는다. - 이벤트가 -Presenter1 이벤트 -Presenter1 (새 인스턴스)를 잡는다 글로벌 이벤트 버스를 통해 발생하는 것은 본질적으로

그래서 이벤트를 (즉, 규칙 아닌) 새로운 발표자가 웹 -를 GWT 응용 프로그램을 제공 잡는다 페이지를 전체 포스트 백 느낌으로 표시하고, 다른 경우에는 기존 양식을로드하는 데스크톱 응용 프로그램 느낌을 갖습니다.

희망이 도움이됩니다.

+0

나는 그것을 그대로 두어야하는 것처럼 들립니다. 이벤트를 변경하기 위해 이벤트를 던지면 다음 페이지로 넘어가려는 이벤트를 트리거 한 페이지의 모든 데이터가 이벤트 객체 자체에 포함되어야한다고 생각합니까? – MayoMan

+0

클라이언트 측 데이터베이스 (기본적으로 데이터를 보유하고 캐시하는 클래스)를 구현하면 발표자와 뷰에서 데이터를 공유하는 데 도움이됩니다. http://gwt.googleusercontent.com/samples/Showcase/Showcase.html#!CwDataGrid에는 ContactsDatabase 클래스의 예가 있습니다. – Neeko

0

싱글 톤을 사용하지 마십시오 ... 퍽!

발표자를 늦게 초기화하고 참조를 저장하여 재사용 할 때마다 매번 새 인스턴스를 만들 필요가 없습니다.

보기를 다시 사용하는 것과 마찬가지로 발표자를 재사용하는 방법을 강조하기 위해 다음 예제를 가져 와서 https://developers.google.com/web-toolkit/articles/mvp-architecture-2#code_splitting에서 수정했습니다. RunAsyncCallback를 통해 코드 분할의 성능 이점 게다가

public void onValueChange(ValueChangeEvent<String> event) { 
    String token = event.getValue(); 

    if (token != null) { 
     if (token.equals("list")) { 
     GWT.runAsync(new RunAsyncCallback() { 
      ... 
      public void onSuccess() { 
      // lazily initialize our views and presenters, and keep them around to be reused 
      if (contactsView == null) { 
       contactsView = new ContactsViewImpl<ContactDetails>(); 
      } 
      if (contactsPresenter == null) { 
       contactsPresenter = new ContactsPresenter(rpcService, eventBus, contactsView); 
      } 
      contactsPresenter.go(container); 
      } 
     }); 
     } 
     ... 
    } 

은, 본질적으로, 당신은의 AppController 클래스 필드 각 발표자에 대한 참조를 유지하고 역사 토큰을 전환 할 때 다시 사용할.

0

gwt-platform을 사용하는 것이 좋습니다. 나는 그것을 여러 프로젝트에서 사용했지만 결코 성능에 문제가 없었습니다.이는 매우 강력하고 우수한 성능을 유지하면서 향후 애플리케이션을보다 쉽게 ​​확장 할 수 있도록 애플리케이션을 구조화하는 데 도움이됩니다.