0

我正在开发一个 iPhone 应用程序。

我正在从服务器进行异步更新。更新完成下载后,我发出 NSNotification

[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_DATA_RECEIVED object:self userInfo:@{ @"updateKey": updateKey }];

在我的 viewController 我声明了观察者

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateReceived:) name:NOTIFICATION_DATA_RECEIVED object:nil];

收到通知时将执行的选择器:

- (void) updateReceived:(NSNotification *)notification
{
    [self performSelectorOnMainThread:@selector(updateData:) withObject:nil waitUntilDone:NO];
}

updateData需要在主线程上执行,因为它会更改核心数据中的实体,并且除非我们使用某些特定的库,否则无法针对不同的威胁执行此操作。我不想改变它。

我的问题:

updateData需要一段时间,它正在冻结 UI,因为它位于主线程上。完成后,我需要显示“正在加载数据...”叠加层。

我在视图控制器中有 2 个方法将显示覆盖:showLoadingOverlayhideLoadingOverlay

我需要在调用和完成showLoadingOverlay时调用。updateDatahideLoadingOverlay

问题是,由于它是在主线程上执行的,所以我不知道如何在更新数据时显示覆盖。我尝试在发送通知之前直接显示它并在updateData方法结束时将其隐藏,但它不起作用。

任何帮助是极大的赞赏。

谢谢

4

2 回答 2

0

也许,只是也许,您正在使用也安排在主线程上但在执行 updateData 之后的动画。在这种情况下,请确保动画在调用 updateData 之前开始。例如,您可以执行以下操作:

- (void)updateReceived:(NSNotification*)notification {
    [self startAnimationOnComplete: ^{
        [self performSelectorOnMainThread:@selector(updateData:) withObject:nil waitUntilDone:NO];
    }]
} 
于 2013-02-14T08:44:58.050 回答
0

我找到了一种方法。在显示叠加层 1 毫秒后,我最终使用 NSTimer 运行 updateReceived 方法。

- (void) updateReceived:(NSNotification *)notification
{
    [self showLoadingOverlay];
    [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(updateDataOnMainThread:) userInfo:nil repeats:NO];
}

- (void) updateDataOnMainThread:(NSTimer *)timer
{
    [self performSelectorOnMainThread:@selector(updateData:) withObject:nil waitUntilDone:NO];
}
于 2013-02-14T10:58:56.077 回答