J'ai remarqué que certaines applications telles que Safari et Mail affichent un indicateur de chargement dans la barre d'état (la barre tout en haut du téléphone) lorsqu'elles accèdent au réseau. Existe-t-il un moyen de faire la même chose dans les applications SDK, ou s’agit-il d’une seule chose d’Apple?
C'est dans UIApplication:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
pour Swift:
UIApplication.shared.isNetworkActivityIndicatorVisible = true
J'ai trouvé les macros suivantes très utiles!
#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
Vous pouvez donc simplement appeler ShowNetworkActivityIndicator();
ou HideNetworkActivityIndicator();
à partir de votre application (tant que l'en-tête est bien entendu!).
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 de supprimer le statut lorsqu'une connexion est rétablie mais qu'une autre est toujours active):
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];
}
Un code de ligne unique pour le faire:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
Vous devez également cacher l'indicateur d'activité une fois votre appel réseau terminé.
Si vous utilisez AFNetworking
, vous n'avez pas besoin de faire grand chose.
Effectuez les modifications suivantes dans la classe AppDelegate
:
Importer AFNetworking/AFNetworkActivityIndicatorManager.h
Mettez ceci dans didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
Il peut également être utile de s’assurer que vous l’exécutez sur le thread principal car il est lié à l’interface utilisateur.
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
L'indicateur d'activité réseau de la barre d'état était obsolète dans iOS 1.
Utiliser UIApplication.shared.isNetworkActivityIndicatorVisible = true
ne fonctionnera plus.
Le message de dépréciation dit:
Fournissez une interface utilisateur d'activité réseau personnalisée dans votre application si vous le souhaitez.