UIActivityIndi​​catorView不显示/开始动画

时间:2014-07-24 22:03:15

标签: ios uiview nsthread uiactivityindicatorview

我有一个带有UIActivityIndi​​catorView的视图控制器,以及一个触发同步的按钮。同步在单独的类中执行,通常在后台执行。可以从我的应用程序的不同部分触发同步,并向我的视图控制器通知同步事件。

现在,当我点击按钮时,UIActivityIndi​​catorView不会显示也不会显示动画。

这是我在viewDiDLoad中的代码:

self.syncNowActivityIndicatorView.hidesWhenStopped = YES;
self.syncNowActivityIndicatorView.color = [MRStyleController getFirstLightColor];



[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(leechStarted)
                                             name:MRLeechStartedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(mergeStarted)
                                             name:MRMergeStartedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(fileSyncStarted)
                                             name:MRFileSyncStartedNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(leechFailed)
                                             name:MRLeechFailedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(mergeFailed)
                                             name:MRMergeFailedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(fileSyncFailed)
                                             name:MRFileSyncFailedNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(leechCompleted)
                                             name:MRLeechCompletedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(mergeCompleted)
                                             name:MRMergeCompletedNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(fileSyncCompleted)
                                             name:MRFileSyncCompletedNotification
                                           object:nil];

我在其他一些帖子中已经读过,如果我以相同的方法启动和停止指标视图,它将无法工作,因为在执行方法时ui不会更新。因此,必须在单独的线程中启动和停止动画,但在我的情况下,启动和停止调用都采用不同的方法。

请注意,我的日志显示时会收到通知。

以下是其他方法:

-(void)leechStarted{
    NSLog(@"Leech started");
    if (!_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView startAnimating];
    }
}
-(void)mergeStarted{
    NSLog(@"Merge started");
    if (!_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView startAnimating];
    }
}
-(void)fileSyncStarted{
    NSLog(@"FileSync started");
    if (!_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView startAnimating];
    }
}

-(void)leechFailed{
    NSLog(@"Leech failed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
}
-(void)mergeFailed{
    NSLog(@"Merge failed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
}
-(void)fileSyncFailed{
    NSLog(@"FileSync failed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
}

-(void)leechCompleted{
    NSLog(@"Leech completed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
}
-(void)mergeCompleted{
    NSLog(@"Merge completed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
 }
 -(void)fileSyncCompleted{
    NSLog(@"FileSync completed");
    if (_syncNowActivityIndicatorView.isAnimating) {
        [_syncNowActivityIndicatorView stopAnimating];
    }
 }

这里是按钮的IBAction:

- (IBAction)syncNow:(id)sender {
    // perform synchronisation
    CoreDataHelper *cdh = [(MRMedSafeAppDelegate *) [[UIApplication sharedApplication] delegate] cdh];
    if ([cdh canSynchronize]) {
        [cdh mergeEnsemble];
        [cdh synchroniseFiles];
    }
}

mergeEnsemble发布了leech和合并通知以及synchroniseFiles文件同步通知,我根据日志收到了这些通知。

1 个答案:

答案 0 :(得分:1)

您必须在主线程上执行开始/停止动画:

-(void)stopAnimation:(id)sender {
   if( _syncNowActivityIndicatorView.isAnimating ) {
      [_syncNowActivityIndicatorView stopAnimating];
   }
}

-(void)startAnimation:(id)sender {
   if( !_syncNowActivityIndicatorView.isAnimating ) {
      [_syncNowActivityIndicatorView startAnimating];
   }
}

-(void)leechStarted{
    NSLog(@"Leech started");
    [self performSelectorOnMainThread:@selector(startAnimation:) withObject:self waitUntilDone:YES];
}

-(void)leechFailed{
    NSLog(@"Leech failed");
    [self performSelectorOnMainThread:@selector(stopAnimation:) withObject:self waitUntilDone:YES];
}