RookieAppler
RookieAppler

Reputation: 1545

Dealing with two screens and one activity indicator in iOS

I have 3 screens on my app.First is login. Second is search and third is process the task. On login i retrieve data from a web service. It returns data in XML format. So the data is considerably large. So i am doing that task on a background thread like this to stop Mainthread freezing up on me:

-(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");
}  

So on condition that login was successful, i move to screen 2. But the background thread is still in process( i know because i have logs logging values) . I want an activity indicator showing up here (2nd screen)telling user to wait before he starts searching. So how do i do it?How can i make my activity indicator listen/wait for background thread. Please let me know if you need more info.Thanks

EDIT: so I edited accordingly but the notification never gets called. I put a notification at the end of getAllCustomerValues and in viewDidLoad of SearchScreen i used it. That notification on 2nd screen to stop animating never gets called. What is the mistake i am doing.?Thanks

EDIT 2: So it finally hits the method. I dont know what made it to hit that method. I put a break point. I wrote to stop animating but it wouldn't. I wrote hidesWhenStoppped and hidden both to YES. But it still keeps animating.How do i get it to stop?

Upvotes: 0

Views: 453

Answers (3)

Bergasms
Bergasms

Reputation: 2203

Ok, if it is not the main thread, put the following in and that should fix it.

- (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");
 }  

Upvotes: 1

lidders
lidders

Reputation: 140

You could use a delegate pointing to your view controller & a method in your view controller like:

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

And then in the background thread:

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

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

Upvotes: 0

JDx
JDx

Reputation: 2655

Could you put your background operation into a separate class and then set a delegate on it so you can alert the delegate once the operation has completed?

I havent tried this, its just an idea :)

Upvotes: 0

Related Questions