在iOS中处理两个屏幕和一个活动指示器

时间:2013-01-24 00:36:42

标签: ios core-data background nsthread uiactivityindicatorview

我的app上有3个屏幕。首先是登录。第二是搜索,第三是处理任务。 登录时,我从Web服务检索数据。它以XML格式返回数据。所以数据相当大。所以我在这样的后台线程上执行该任务,以阻止Mainthread冻结我:

-(BOOL)loginEmp
{
 .....some computation
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                                 (unsigned long)NULL), ^(void) {
            [self getAllCustomerValues];
        });
}
 -(void)getAllCustomerValues
{
   ....more computation.Bring the data,parse it and save it to CoreData DB.
   //notification - EDIT

NSNotification *notification =[NSNotification notificationWithName:@"reloadRequest"
                                                            object:self];
[[NSNotificationCenter defaultCenter] postNotification : notification];

}
 //EDIT

//SearchScreenVC.m
- (void)viewDidLoad
{
 ....some computation
    [self.customerActIndicator startAnimating];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(stopActivityIndicator)
                                             name:@"reloadRequest"
                                           object:nil];
  }
 - (void)stopActivityIndicator
{
[self.customerActIndicator stopAnimating];
self.customerActIndicator.hidesWhenStopped = YES;
self.customerActIndicator.hidden =YES;
NSLog(@"HIt this at 127");
}  

因此,在登录成功的情况下,我移动到屏幕2.但后台线程仍在进行中(我知道因为我记录了日志记录值)。我想要一个活动指示器显示在这里(第二个屏幕)告诉用户在他开始搜索之前等待。那么我该怎么做呢?我如何让我的活动指示器监听/等待后台线程。如果您需要更多信息,请告诉我。谢谢

编辑:所以我进行了相应的编辑,但通知永远不会被调用。我在getAllCustomerValues的末尾添加了一个通知,并在SearchScreen的viewDidLoad中使用了它。第二个屏幕上停止动画的通知永远不会被调用。我在做什么错。感谢

编辑2:所以它最终击中了方法。我不知道是什么让它击中那个方法。我提出了一个断点。我写信停止制作动画,但事实并非如此。我写了hidesWhenStoppped并隐藏到YES。但它仍然保持动画。我如何让它停下来?

3 个答案:

答案 0 :(得分:1)

好的,如果它不是主线程,请将以下内容添加进去,并且应该修复它。

- (void)stopActivityIndicator
{
      if(![NSThread isMainThread]){
         [self performSelectorOnMainThread:@selector(stopActivityIndicator) withObject:nil waitUntilDone:NO];
          return;
       }

 [self.customerActIndicator stopAnimating];
  self.customerActIndicator.hidesWhenStopped = YES;
   self.customerActIndicator.hidden =YES;
  NSLog(@"HIt this at 127");
 }  

答案 1 :(得分:0)

您是否可以将后台操作放入单独的类中,然后在其上设置委托,以便在操作完成后提醒代理人员?

我没试过这个,这只是一个想法:)

答案 2 :(得分:0)

您可以使用指向视图控制器的代理人员。视图控制器中的方法如:

- (void) updateProgress:(NSNumber*)percentageComplete { 
}

然后在后台线程中:

float percentComplete = 0.5; // for example
NSNumber *percentComplete = [NSNumber numberWithFloat:percentComplete];

[delegate performSelectorOnMainThread:@selector(updateProgress:) withObject:percentageComplete waitUntilDone:NO];