4 votes

networkActivityIndicatorVisible

Ce code est-il correct à utiliser avec le networkActivityIndicatorVisible ?

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    UIApplication* app2 = [UIApplication sharedApplication]; 
    app2.networkActivityIndicatorVisible = YES; 
    [self loadSources];  // Loads data in table view
    app2.networkActivityIndicatorVisible = NO; 
}

Teo

17voto

Jano Points 37593

Depuis NetworkActivityIndicatorVisible peut être réglé à partir de plusieurs points alors qu'une connexion est toujours active, vous devez suivre le nombre d'appels qui l'activent/désactivent. Les éléments suivants UIApplication utilise une variable statique pour ce faire :

// file UIApplication+NetworkActivity.h
@interface UIApplication (NetworkActivity)
- (void)showNetworkActivityIndicator;
- (void)hideNetworkActivityIndicator;
@end

// file UIApplication+NetworkActivity.m
#import "UIApplication+NetworkActivity.h"
static NSInteger activityCount = 0;
@implementation UIApplication (NetworkActivity)
- (void)showNetworkActivityIndicator {
    if ([[UIApplication sharedApplication] isStatusBarHidden]) return;
    @synchronized ([UIApplication sharedApplication]) {
        if (activityCount == 0) {
            [self setNetworkActivityIndicatorVisible:YES];
        }
        activityCount++;
    }
}
- (void)hideNetworkActivityIndicator {
    if ([[UIApplication sharedApplication] isStatusBarHidden]) return;
    @synchronized ([UIApplication sharedApplication]) {
        activityCount--;
        if (activityCount <= 0) {
            [self setNetworkActivityIndicatorVisible:NO];
            activityCount=0;
        }    
    }
}
@end

Importer maintenant UIApplication+NetworkActivity.h dans votre code client et appeler

// on connection started:
[[UIApplication sharedApplication] showNetworkActivityIndicator];

// on connection finished:
[[UIApplication sharedApplication] hideNetworkActivityIndicator];

Si votre préoccupation est que l'indicateur ne clignote que pendant une seconde, vous n'avez pas besoin d'un processus en arrière-plan. Il suffit d'appeler [self performSelector:@selector(loadSources) withObject:Nil afterDelay:0.1] afin que le thread de l'interface utilisateur ait le temps de lancer l'animation de l'indicateur de réseau avant de bloquer le thread principal.

5voto

timonroe Points 21

Si vous n'utilisez pas AFNetworking ( https://github.com/AFNetworking/AFNetworking ), vous pouvez d'ores et déjà consulter l'implémentation de leur indicateur d'activité réseau dans AFNetworkingActivityIndicatorManager.

Si vous choisissez d'utiliser cette bibliothèque pour votre accès au réseau, elle gère automatiquement l'indicateur d'activité du réseau pour vous. Tout ce que vous avez à faire est de faire un appel dans votre AppDelegate pour le mettre en place, ils font le reste du travail pour vous.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
}

3voto

Une solution plus courte pour le suivi de plusieurs activités - en utilisant à nouveau une catégorie UIApplication et une variable statique :

@interface UIApplication (NetworkActivityIndicator)
    - (void)toggleNetworkActivityIndicatorVisible:(BOOL)visible;
@end

@implementation UIApplication (NetworkActivityIndicator)
-(void)toggleNetworkActivityIndicatorVisible:(BOOL)visible {
    static int activityCount = 0;
    @synchronized (self) {
        visible ? activityCount++ : activityCount--;
        self.networkActivityIndicatorVisible = activityCount > 0;
    }
}
@end

1voto

teo Points 129

J'ai finalement résolu le problème. J'ai utilisé performSelectorInBackground pour exécuter le chargement des données dans tableView

-(void)beginLoadSources {
    [self loadSources];  // Loads data in table view
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self performSelectorInBackground:@selector(beginLoadSources) withObject:nil];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
}

0voto

MSinga Pro Points 31

Utilisez le code suivant dans votre ExempleUIWebView.m before - (void)viewDidLoad

  • (void)webViewDidFinishLoad :(UIWebView *)webView { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO ; [ProgressHUD dismiss] ; } et utiliser ceci après - (void)viewDidLoad

[UIApplication sharedApplication].networkActivit [ProgressHUD show:@"Chargement de la politique de confidentialité" Interaction:NO] ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X