如何在iPhone上控制网络活动指示器

时间:2010-09-02 14:36:06

标签: iphone cocoa-touch networking

我知道为了显示/隐藏状态栏上的悸动,我可以使用

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

但我的程序从多个线程发送了comm请求,我需要一个位置来控制是否应该显示或隐藏throbber。

我想到了一个集中式的类,每个comm请求都会注册,这个类会知道当前一个或多个请求是否正在传输字节,并且会打开throbber,否则 - 关闭。

这是要走的路吗?为什么Apple没有在网络发生时自动出现悸动

2 个答案:

答案 0 :(得分:7)

尝试使用以下内容:

static NSInteger __LoadingObjectsCount = 0;

@interface NSObject(LoadingObjects)

+ (void)startLoad;
+ (void)stopLoad;
+ (void)updateLoadCountWithDelta:(NSInteger)countDelta;

@end

@implementation NSObject(LoadingObjects)

+ (void)startLoad {
    [self updateLoadCountWithDelta:1];
}

+ (void)stopLoad {
    [self updateLoadCountWithDelta:-1];
}

+ (void)updateLoadCountWithDelta:(NSInteger)countDelta {
    @synchronized(self) {
        __LoadingObjectsCount += countDelta;
        __LoadingObjectsCount = (__LoadingObjectsCount < 0) ? 0 : __LoadingObjectsCount ;

        [UIApplication sharedApplication].networkActivityIndicatorVisible = __LoadingObjectsCount > 0;
    }
}

更新:使线程安全

答案 1 :(得分:0)

UIApplication子类单例中使用某些逻辑似乎是处理此问题的自然方法。

//@property bool networkThingerShouldBeThrobbingOrWhatever;
// other necessary properties, like timers
- (void)someNetworkActivityHappened {
    // set a timer or something
}
- (void)networkHasBeenQuietForABit
    // turn off the indicator.
    // UIApplcation.sharedApplication.networkActivityIndicatorVisible = NO;
}