我的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。但它仍然保持动画。我如何让它停下来?
答案 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];