Safari 및 Mail과 같은 일부 앱이 네트워크에 액세스 할 때 상태 표시 줄 (전화기 맨 위에있는 표시 줄)에 로딩 표시기가 표시되는 것을 확인했습니다. SDK 앱에서 동일한 작업을 수행 할 수있는 방법이 있습니까? 아니면 이것이 Apple 전용입니까?
답변
UIApplication에 있습니다.
목표 C의 경우 :
스타트:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
종료:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
신속한 :
스타트
UIApplication.shared.isNetworkActivityIndicatorVisible = true
종료
UIApplication.shared.isNetworkActivityIndicatorVisible = false
답변
다음 매크로가 매우 유용하다는 것을 알았습니다!
#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
따라서 앱 내에서 ShowNetworkActivityIndicator();
또는 전화를 걸 HideNetworkActivityIndicator();
수 있습니다 (물론 헤더가 포함되어있는 한!).
답변
나는 무슨 일이 일어나고 있는지에 대한 카운터를 유지함으로써 다중 연결의 문제를 해결하는 싱글 톤을 작성했습니다 (연결이 반환되지만 다른 연결이 여전히 활성 상태 일 때 상태를 제거하지 않기 위해).
헤더 파일 :
#import <Foundation/Foundation.h>
@interface RMActivityIndicator : NSObject
-(void)increaseActivity;
-(void)decreaseActivity;
-(void)noActivity;
+(RMActivityIndicator *)sharedManager;
@end
및 구현 :
#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
예:
[[RMActivityIndicator sharedManager]increaseActivity];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
[[RMActivityIndicator sharedManager]decreaseActivity];
}
답변
이를 수행하는 한 줄 코드 :
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
답변
네트워크 통화가 완료된 후에도 활동 표시기를 숨기는 데주의해야합니다.
사용하는 경우 AFNetworking
하면 많은 작업을 수행 할 필요가 없습니다.
AppDelegate
클래스 에서 다음 변경 사항을 수행하십시오 .
-
수입
AFNetworking/AFNetworkActivityIndicatorManager.h
-
이것을 넣어
didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
답변
상태 표시 줄 네트워크 활동 표시기는 iOS 13 에서 더 이상 사용되지 않습니다. .
사용 UIApplication.shared.isNetworkActivityIndicatorVisible = true
은 더 이상 작동하지 않습니다.
지원 중단 메시지는 다음과 같습니다.
원하는 경우 앱에 사용자 지정 네트워크 활동 UI를 제공합니다.
답변
UI와 관련된 메인 스레드에서 실행 중인지 확인하는 것도 도움이 될 수 있습니다.
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});