0

如何确保再次显示应用程序(从后台启动或启动)时仅调用一次我的表数据函数?

也就是说,我希望在用户单击应用程序图标时刷新我的表数据,并且只刷新一次。因此要求是:​​a)在用户单击应用程序图标后仅调用一次控制器中的更新方法 b)无论用户是否(i)第一次启动应用程序,(ii)从后台返回都有效, (iii) 请求应用程序的用户的任何其他方式回到前台。

我目前在实现中遇到的问题是,在应用程序从后台返回的情况下,数据更新被调用了两次,所以我基本上想对此进行改进。我目前正在做的有缺陷的方式是:

- (void)updateEventData {
    // UPDATE CODE HERE
}
- (void)becomeActive:(NSNotification *)notification {
    [self updateEventData];
    [self.tableView reloadData];
}

- (void)viewDidLoad {
    [super viewDidLoad];  
    [self updateEventData];

    // Auto Refresh Data - Handle Case where App becomes active from background & you want to refresh data
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(becomeActive:)
                                                 name:UIApplicationDidBecomeActiveNotification
                                               object:nil];

}
4

3 回答 3

1

您可以通过以下方式实现它:

1) 在 NSUserDefault 中取一个变量。2) 首次启动应用程序时将其值设置为 FALSE。3) 在各自的视图控制器中获取 NSUserDefault 变量的值。如果它的值是 FALSE 则调用更新方法。4) 现在,当应用程序变为活动状态时,将变量值设置为 TRUE。5) 在各自的视图控制器中获取它的值。如果其值为 TRUE,则不要调用 update 方法。6) 所以,update 方法只会被调用一次。

希望对您有所帮助。可能会有一些细微的变化。

如果有任何困难,请告诉我。

于 2011-06-06T05:10:05.937 回答
0

好吧,我从您的问题中了解到,您只想在启动应用程序时通过单击 iPhone 上的应用程序图标来更新表数据。首先了解应用程序的执行,首先调用主函数,然后在您的应用程序中调用代表

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.
    [self postNotification];
    [self.window makeKeyAndVisible];

    return YES;
}

您可以在此方法中发布通知,因为它被调用一次。而且,如果您想在 ViewDidLoad 方法中以自己的方式执行此操作,那么我认为您还必须删除通知的观察者,我认为这可能是它被调用两次的原因,因为您没有删除通知。

于 2011-06-06T05:07:17.513 回答
0

作为写这个问题和审查答案的一部分,我想我可能有一个很好的解决方案......

  • 创建一个实例变量/属性“initialLoad”
  • 首先在 viewDidLoad 中将其设置为 TRUE
  • 然后在 becomeActive 方法中执行以下操作:

代码:

- (void)becomeActive:(NSNotification *)notification {
    if (!self.initialLoad) {
        [self updateEventData];
        [self.tableView reloadData];
    }
    self.initialLoad = false;
}

似乎工作正常...

于 2011-06-06T06:42:41.187 回答