2011-05-02 3 views
1

Facebook의 iPhone 응용 프로그램에서 뉴스 피드가 응용 프로그램이 활성화 될 때마다 새로 고침됩니다. 비슷한 일을하고 싶지만 경쟁 조건이 걱정됩니다. 다음과 같이 내 응용 프로그램의 일반적인 부트 스트랩은 다음과 같습니다응용 프로그램이 활성화 될 때보기를 새로 고치는 경주 조건

UIApplicationDelegate에게

- (void)applicationDidFinishLaunching:(UIApplication*)application 
{ 
    [window addSubview:[self.navigationController view]; 
    [window makeKeyAndVisible]; 
} 

- (void)applicationDidBecomeActive:(UIApplication*)application 
{ 
    [rootViewController refresh]; 
} 

RootViewController 사방 NSLog을 뿌리 후, 나는 될 작업의 순서를 결정

#pragma mark custom 

- (void)refresh 
{ 
    if (self.newsFeedModel == nil) { 
    self.newsFeedModel = [[NewsFeedModel alloc] initWithDelegate:self]; 
    } 
    [self.newsFeedModel request]; 
} 

#pragma mark UIViewController 

- (void)viewDidLoad 
{ 
    // initialize the table 
    // add subviews and whatnot 
} 

#pragma mark NewsFeedDelegate 

- (void)newsFeedSucceeded:(NSMutableArray*)feed 
{ 
    // reload table view with new feed data 
} 

:

  1. applicationDidBecomeActive
  2. 새로 고침을 아래 applicationDidFinishLaunching 6,
  3. 의 viewDidLoad
  4. newsFeedSucceeded 루트 뷰가로드되기 전에 새로 고침 호출하는 방법을

알 수 있습니다. 우리가 서버에 질의하는 동안 바쁜 동안 루트보기가로드됩니다. 서버가 응답하면 루트보기에 피드가 채워집니다. 이 작업은 네트워크 작업이 오래 걸리기 때문에 대부분의 경우에 효과적입니다. 그러나 네트워크 작업이 뷰를로드하는 것보다 빠르게 완료되면 뷰가로드되기 전에 뉴스 피드를 구성하려고 시도 할 것입니다. 이것은 나쁠 것입니다. 이 경쟁 조건을 해결하기위한 최고의 코코아 터치 연습은 무엇입니까? 나는 상태에 따라 우리가 어떤 상태에 있는지를 결정하고 상태에 따라 뉴스 피드를 새로 고치기 위해 많은 플래그를 설정할 것입니다.하지만이 문제를 처리하기 위해 코코아 터치에 이벤트가 내장되어 있는지 궁금합니다.

답변

1

대신 applicationWillEnterForeground :를 살펴보고 싶습니다.

applicationDidBecomeActive : 앱이 여전히 포 그라운드에서 실행되는 동안 호출 될 수 있습니다. 예를 들어 응용 프로그램이 포 그라운드에있는 동안 텍스트 메시지가 나타나고 사용자가 응용 프로그램을 종료하면 applicationDidBecomeActive :가 호출됩니다.

NSNotificationCenter를 사용하여 RootViewController에서 UIApplicationWillEnterForegroundNotification 이벤트에 가입 할 수 있습니다. 내가 RootViewController initWithNibName : 또는 어느 init 메서드를 사용하고 있습니다.

이제 새로 고침을 2 곳에서 호출하면됩니다. viewDidLoad가 끝나고 applicationWillEnterForeground :가 호출 될 때마다 다시 한 번.

이것은 경쟁 조건 문제를 해결합니다. RootViewController가 처리 중이므로 알고있을 때 자신이 새로 고쳐지기 때문에 괜찮습니다.

RootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if(self) { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil]; 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    // initialize the table 
    // add subviews and whatnot 
    [self refresh]; 
} 


- (void)applicationWillEnterForeground:(UIApplication *)application { 
    [self refresh]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+0

응용 프로그램 ** 것이다 ** EnterForeground이보기 * *이 화면에로드됩니다 만, 의미합니다 그것을하지 * 현재 * 화면. 테이블보기가 화면에 표시되기 전에 조작하는 것이 안전합니까? – JoJo

+0

[tableView reload]를 newsFeedSucceeded :에서 호출해도 문제가 없습니다. tableView는 datasource와 delegate 콜백을 통해 준비가되었을 때 데이터를 요청할 것입니다. – jaminguy

관련 문제