0

我的应用程序上有 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 和 hidden 都写成了 YES。但它仍然保持动画。我如何让它停止?

4

3 回答 3

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");
 }  
于 2013-01-25T03:28:23.430 回答
0

您能否将后台操作放入一个单独的类中,然后在其上设置一个委托,以便在操作完成后提醒委托?

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

于 2013-01-24T10:37:12.613 回答
0

您可以使用指向您的视图控制器的委托和视图控制器中的方法,例如:

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

然后在后台线程中:

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

[delegate performSelectorOnMainThread:@selector(updateProgress:) withObject:percentageComplete waitUntilDone:NO];
于 2013-01-24T17:35:29.267 回答