2012-02-13 2 views
2
I 앱이 다시 활성화되어 있는지 인식하고 일부 데이터 새로 고침 내보기 컨트롤러에서이 기능을 사용하고

:UIApplicationWillEnterForegroundNotification은 점점을 호출되는 더

[[NSNotificationCenter defaultCenter] 
      addObserver:self 
       selector:@selector(becomeActive:) 
        name:UIApplicationWillEnterForegroundNotification 
       object:nil]; 

이 활성화받은 후 상쾌한 작동을하지만, 매번 앱이 백그라운드에서 포 그라운드로 돌아갈 때 (비활성에서 활성으로) 함수를 한 번 더 호출합니다.

그래서 앱을 4 번 닫았다가 열면 함수가 4 번 호출됩니다!

편집은 :이 기능은이 방법으로 호출됩니다 :

  1. 가까운 오픈 : 호출 된 함수 2 회
  2. : 1 시간 (즉, 방법 내가 원하는)
  3. 가까이 열린 호출 된 함수
  4. 확대 개방 : 호출 된 함수의 3 배
  5. 확대 개방 : 호출 된 함수의 4 배

하지만 포 그라운드로 돌아온 후에 1 번만 호출하면됩니다. 어떤 상황에서는 앱이 활성화되고 데이터를 확인한 후에 경고보기를 표시해야합니다. 이 경고보기는 기능이 4 번 호출 될 때 4 번 표시됩니다.

앱 델리게이트에서이 함수는 아무 일도하지 않지만 언급되어 있습니다.

저는 Xcode 4.2와 iOS 5를 사용하고 있습니다! 나는 또한 UIApplicationDidBecomeActive을 사용했지만, 같은 문제가 발생합니다.

+0

문제는 더 많은 관찰자를 계속 추가하고 이벤트가 발생할 때 각 인스턴스가 전화를 겁니다. 한 가지 방법이나 다른 방법으로 언제든지 관찰자의 인스턴스를 하나만 활성화 할 수 있습니다. –

답변

0

사실이 알림이하는 일입니다. 응용 프로그램이 시작될 때 알림을 받으려면 applicationDidFinishLaunching을 사용하십시오.

+0

응용 프로그램이 다시 활성화되면 (또는 다시 포 그라운드로) 호출되지 않습니다. – user1175122

8

언제 당신이 자신을 관찰자로 추가하는지 알지 못하지만, 앱이 활성화 될 때마다, 당신은 자기 자신을 관찰자로 계속 추가하고있는 것처럼 보입니다. 따라서 다중 호출.

사용자는보기 컨트롤러를 한 번만 옵저버로 추가해야합니다. controllers init : 메소드를 사용해보십시오. 그리고 dealloc : 메소드에서 관찰 컨트롤러로서 뷰 컨트롤러를 제거했는지 확인하십시오.

+1

나는 당신의 제안에 동의하지 않습니다. 다른 객체에 이벤트에 대한 정보를 얻으려면 'UIApplicationWillEnterForegroundNotification'에 등록하는 것이 좋습니다. 사실 훨씬 더 좋은 디자인을 만들 수 있습니다. 문제의 원인에 대한 귀하의 가정에 동의합니다. 원래 포스터는 알림 센터에 _once_ 뷰 컨트롤러를 추가해야하며 앱이 포 그라운드로 갈 때나 배경으로 갈 때마다가 아니라 반드시 추가해야합니다. –

+0

내가 업데이트하려는 viewcontroller를 업데이트 할 수 있기 때문에 NSNotifactionCenter를 사용하여이 방법을 정말 좋아합니다. 알림 센터에 한 번 추가하는 것의 의미는 아닙니다. nsnotification 센터에 넣을 수있는 가장 좋은 곳이 뭐지? 사실 그것은보기 컨트롤러에 있습니다, 이것이 문제가 될 수 있습니까? 내가 직접 함수에 넣어야합니까? 아마도 한 번만 불릴만한 무언가일까요? 나 제안있어? – user1175122

+0

이 접근 방법을 사용하면 문제가 없다는 것을 알 수 있습니다. [[NSNotificationCenter defaultCenter] addObserver : ...]를 한 번만 호출해야합니다. 따라서이 호출을 컨트롤러 viewDidLoad : 메서드에 배치하고 컨트롤러가 소멸 될 때 defaultCentre에서 컨트롤러를 제거하도록합니다 ([[NSNotificationCenter defaultCenter] removeObserver : ...] 사용). 현재 현재 위치는 어디입니까? 호출 [[NSNotificationCenter defaultCenter] addObserver : ...]? –

0

아니요. 문제가 해결되지 않았습니다.

관찰자를 통해 호출 된 메서드는 더 이상 viewDidLoad을 호출하지 않습니다. viewDidLoad은 한 번만 호출됩니다 (첫 번째 응용 프로그램 시작시).

관찰자를 통해 호출되는 getActive 함수는 이제 viewDidLoad에서 처음 호출 된 메서드를 호출합니다.

또한 removeObserver 기능을 viewDidLoad에 넣습니다.이 기능은 사용자가 앱을 완전히 중지하는 경우에만 호출됩니다.

아이디어와 도움에 감사드립니다! 이제는 멀티 태스킹 응용 프로그램 만들기에 대해 조금 더 알고 있습니다.

0

viewWillDisappear 메서드에서 addObserver를 제거해야한다고 생각합니다. 그것은 나를 위해 일하고있다.

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
관련 문제