2008-10-03 12 views

Odpowiedz

187

Jest w UIApplication:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

dla SWIFT:

UIApplication.shared.isNetworkActivityIndicatorVisible = true 
+1

Dzięki który działa doskonale. Tylko jedna uwaga: symulator zdaje się ignorować tę wartość, która sprawiła, że ​​początkowo nie działała. – rustyshelf

+11

@ labelyshelf, wyświetla się w nowszych symulatorach. – MrHus

+2

'[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible: YES];' // jako jedna liniówka –

31

Znalazłem następujące makra bardzo przydatne!

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

więc można po prostu zadzwonić ShowNetworkActivityIndicator(); lub HideNetworkActivityIndicator(); z poziomu aplikacji (tak długo, jak nagłówek jest włączone oczywiście!).

+31

Dlaczego nie zdefiniować kategorii na UIApplication? Wydaje się dużo ładniejszy (i bardziej debuggable) niż #define. –

25

Napisałem singleton, który rozwiązuje problem wielu połączeń poprzez utrzymywanie licznika, co się dzieje (aby uniknąć usunięcia stanu, gdy powróci połączenie, ale drugi jest nadal aktywny):

Plik nagłówka:

#import <Foundation/Foundation.h> 

@interface RMActivityIndicator : NSObject 

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

+(RMActivityIndicator *)sharedManager; 

@end 

i realizacja

#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 

przykład:

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

Dzięki @Schrockwell, ulepszyłem go jeszcze bardziej, używając synchronicznych bloków - zobaczyłem stan wyścigu, w którym aktywność nie została odpowiednio zmniejszona. – Resh32

+3

Dobry przykład jak robić proste rzeczy trudne) – fnc12

20

Pojedyncza linia kodu, aby to zrobić:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
2

Może to również być pomocne do upewnij się, że działa to na głównym wątku, ponieważ jest to związane z UI.

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

Musisz zadbać o ukrywanie wskaźnika aktywności również po zakończeniu połączenia sieciowego.

Jeśli używasz AFNetworking, to nie musisz dużo robić.

zrobić następujące zmiany w AppDelegate klasy:

  1. importu AFNetworking/AFNetworkActivityIndicatorManager.h

  2. umieścić to w didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

+1

Lub z restkitem będzie to #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES]; – deepwinter

Powiązane problemy