2015-09-12 1 views
0

que je développe une aplication iOS qui utilise Parse backends, et je veux montrer indicateur Acctivity dans ma barre de navigation pour jouer animanting lorsque les étoiles d'activité de réseau dans la barre d'état et arrêtez d'animer mon indicateur d'activité dans la barre de navigation lorsque le réseau arrête l'activité dans la barre d'état.ajouter indicateur d'activité à l'étoile et l'arrêt lorsque la star d'activité réseau et arrêter

self.navigationController.navigationBar.barTintColor = BLUE_COLOR; self.navigationItem.title = @ "MyAppname";

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 
UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator]; 
[self navigationItem].rightBarButtonItem = barButton; 
activityIndicator.hidesWhenStopped = YES; 
//[activityIndicator startAnimating]; 



self.photoArray =[[NSMutableArray alloc]init]; 

PFQuery* curQuery = [UserParseHelper query]; 

[curQuery whereKey:@"username" equalTo:[UserParseHelper currentUser].username]; 
[curQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    self.mainUser = objects.firstObject; 

    if (self.mainUser.geoPoint != nil) { 
     [self queryParseMethod]; 
    } else { 
     [self currentLocationIdentifier]; 
    } 
}]; 

if ([PFUser currentUser]) { 
    PFQuery *usr = [UserParseHelper query]; 
    [usr whereKey:@"objectId" equalTo:[UserParseHelper currentUser].objectId]; 
    [usr findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     self.userStart = [UserParseHelper alloc]; 
     self.userStart = objects.firstObject; 
     self.userStart.online = @"yes"; 
     [self.userStart saveEventually]; 

    }]; 
} 


self.segmentedControl.selectedSegmentIndex = 2; 

}

+0

Alors, quel est votre problème? – mikle94

Répondre

0

appels Parse sont synchrones, ce qui signifie qu'ils se produisent en même temps que d'autres choses qui se passent dans votre application, plutôt que linéaire. Lorsque vous appelez [curQuery findObjectsInBackground..., votre thread principal crée un nouveau thread qui appelle le serveur et finit par exécuter le composant dans votre bloc. Ensuite, le thread principal va immédiatement à la ligne if ([PFUser currentUser]) {, avant que ce bloc ne soit jamais exécuté.

Vous devez faire [activityIndicator startAnimating]; juste après vos blocs de rappel, et la première chose que vous faites à l'intérieur des blocs de rappel est [activityIndicator stopAnimating];

Cependant, vous aurez probablement faire votre deuxième appel startAnimating avant le premier stopAnimating appel, qui est va avoir l'effet involontaire de mettre fin à votre activitéIndicator trop tôt. Vous devrez trouver un moyen de garder une trace du nombre de choses qui utilisent ce activityIndicator. c'est-à-dire, créez un int qui stocke combien de choses utilisent l'indicateur d'activité. Si c'est 0, et que vous essayez de démarrer l'indicateur, incrémentez et démarrez l'indicateur. Si c'est> 0, il suffit de l'incrémenter, car il est déjà en cours d'exécution. Faites le contraire pour arrêter l'indicateur d'activité. Si c'est> 1, il suffit de décrémenter l'int. Si c'est == 1, alors diminuez jusqu'à 0 et arrêtez l'indicateur d'activité.