1. thread1에서 network 사용 (NI 켬)
2. thread2에서 network 사용 (NI 켬)
3. thread1이 통신을 마침 (NI 끔)
4. thread2가 통신을 마침 (NI 끔)
이러한 시나리오를 거쳤을 때 UIApplication의 setNetworkActivitryIndicatorVisible값을 변경하는 것 만으로는 문제가 있습니다. 위의 예에서는 3번에서 NI를 껐을 때 thread1은 network를 사용중임에도 불구하고 NI는 꺼져 있는 것으로 나타납니다.
이러한 현상을 해결하기 위해 작성한 singleton class입니다. (singleton class 제작 방법: http://b4you.net/blog/210)
// NetworkActivityManager.h
#import <Foundation/Foundation.h>
@interface NetworkActivityManager : NSObject
{
volatile NSUInteger _visibleCount;
}
+ (NetworkActivityManager *)sharedNetworkActivityManager;
- (void)setNetworkActivityIndicatorVisible:(BOOL)visible;
@property(readwrite) volatile NSUInteger _visibleCount;
@end
// NetworkActivityManager.m
#import "NetworkActivityManager.h"
@implementation NetworkActivityManager
@synthesize _visibleCount;
+ (NetworkActivityManager *)sharedNetworkActivityManager
{
static NetworkActivityManager *networkActivityClass = nil;
if(networkActivityClass == nil)
{
@synchronized(self)
{
if(networkActivityClass == nil)
{
networkActivityClass = [[self alloc] init];
networkActivityClass._visibleCount = 0;
[self autorelease];
}
}
}
return networkActivityClass;
}
- (void)setNetworkActivityIndicatorVisible:(BOOL)visible
{
@synchronized(self)
{
if(visible == YES)
{
_visibleCount++;
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
else if(visible == NO)
{
if(_visibleCount <= 1)
{
// 모든 곳에서 NO로 했다면
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
_visibleCount = 0;
}
else
{
// YES로 한 곳이 남아있다면
_visibleCount--;
}
}
}
}
@end사용 방법은 다음과 같이~
[[NetworkActivityManager sharedNetworkActivityManager] setNetworkActivityIndicatorVisible:NO];
Posted by 장현준


