2008-10-03 23 views

Répondre

187

Il est en UIApplication:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

pour rapide:

UIApplication.shared.isNetworkActivityIndicatorVisible = true 
+1

Merci qui fonctionne parfaitement. Juste une note de côté: le simulateur semble ignorer cette valeur, ce qui m'a fait penser au début que ça ne marchait pas. – rustyshelf

+11

@rustyshelf, il s'affiche dans les nouveaux simulateurs. – MrHus

+2

'[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible: YES];' // en tant que ligne unique –

31

J'ai trouvé les macros suivantes très utile!

#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES 
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO 

Vous pouvez simplement appeler ShowNetworkActivityIndicator(); ou HideNetworkActivityIndicator(); à partir de votre application (tant que l'en-tête est inclus bien sûr!).

+31

Pourquoi ne pas définir une catégorie sur UIApplication? Cela semble beaucoup plus agréable (et plus débogable) qu'un #define. –

25

j'ai écrit un singleton qui résout le problème des connexions multiples en gardant un compteur de ce qui se passe (pour éviter d'enlever le statut quand un rendement de connexion, mais une autre est toujours actif):

Le fichier d'en-tête:

#import <Foundation/Foundation.h> 

@interface RMActivityIndicator : NSObject 

-(void)increaseActivity; 
-(void)decreaseActivity; 
-(void)noActivity; 

+(RMActivityIndicator *)sharedManager; 

@end 

et mise en œuvre:

#import "RMActivityIndicator.h" 

@interface RMActivityIndicator() 

@property(nonatomic,assign) unsigned int activityCounter; 

@end 

@implementation RMActivityIndicator 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     self.activityCounter = 0; 
    } 
    return self; 
} 

    -(void)increaseActivity{ 
     @synchronized(self) { 
      self.activityCounter++; 
     } 
     [self updateActivity]; 
    } 
-(void)decreaseActivity{ 
    @synchronized(self) { 
      if (self.activityCounter>0) self.activityCounter--; 
    } 
    [self updateActivity]; 
} 
-(void)noActivity{ 
    self.activityCounter = 0; 
    [self updateActivity]; 
} 

-(void)updateActivity{ 
    UIApplication* app = [UIApplication sharedApplication]; 
    app.networkActivityIndicatorVisible = (self.activityCounter>0); 
} 

#pragma mark - 
#pragma mark Singleton instance 

+(RMActivityIndicator *)sharedManager { 
    static dispatch_once_t pred; 
    static RMActivityIndicator *shared = nil; 

    dispatch_once(&pred, ^{ 
     shared = [[RMActivityIndicator alloc] init]; 
    }); 
    return shared; 
} 

@end 

Exemple:

[[RMActivityIndicator sharedManager]increaseActivity]; 
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
    { 
     [[RMActivityIndicator sharedManager]decreaseActivity]; 
    } 
+3

Merci @ Schrockwell, je l'ai encore amélioré en utilisant des blocs synchronisés - j'ai vu une condition de concurrence où l'activité n'a pas été diminuée correctement. – Resh32

+3

Bel exemple de comment faire des choses simples difficiles) – fnc12

20

Un code de ligne unique pour le faire:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
2

Il peut également être utile de vous assurer que vous utilisez sur le thread principal car il est lié à l'interface utilisateur.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 
}); 
4

Vous devez également prendre soin de masquer l'indicateur d'activité une fois votre appel réseau terminé.

Si vous utilisez AFNetworking, vous n'avez pas besoin de faire grand-chose.

Do changements suivants dans AppDelegate Classe:

  1. importation AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Mettre cela en didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

+1

Ou avec le kit de repos, il sera #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES]; – deepwinter