@ DavidBemerguy的方法是一個好的開始,但您通常希望通過dispatch_group_notify
來實現它以隱藏您的指示器。這就是說,IMO,你不需要GCD。你只需要一個NetworkIndicatorController
。
創建一個監聽諸如DidStartNetworkActivity
和DidStopNetworkActivity
之類的通知的對象(控制器)。在開始或停止時發佈通知。在控制器內部,保持計數,當它達到0時,隱藏指示器。像這樣的東西(沒有經過測試的,只是這裏打字,我一直在斯威夫特專門寫的最後幾天,所以請原諒所有缺少分號):
.H:
extern NSString * const DidStartNetworkActivityNotification;
extern NSString * const DidStopNetworkActivityNotification;
@interface NetworkIndicatorController
- (void) start;
- (void) stop;
@end
.M
@interface NetworkIndicatorController()
@property (nonatomic, readwrite, assign) NSInteger count;
@end
@implementation NetworkIndicatorController
- (void)start {
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self name:DidStartNetworkActivityNotification selector:@selector(didStart:) object:nil];
[nc addObserver:self name:DidStopNetworkActivityNotification selector:@selector(didStop:) object:nil];
self.count = 0;
}
- (void)stop {
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self name:DidStartNetworkActivityNotification object:nil];
[nc removeObserver:self name:DidStopNetworkActivityNotification object:nil];
}
- (void)didStart:(NSNotification *)note {
dispatch_async(dispatch_get_main_queue(), {
self.count = self.count + 1;
[[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:YES];
});
}
- (void)didStop:(NSNotification *)note {
dispatch_async(dispatch_get_main_queue(), {
self.count = self.count - 1;
if (self.count <= 0) {
[[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:NO];
}
});
}
你可以用dispatch_group得到類似的東西,但我認爲這很簡單。調度組方法的問題是跟蹤您何時執行而不希望調用dispatch_notify。我確定最終的代碼並不難,但考慮所有可能的競爭條件會更棘手。
您也可以直接直接調用-startNetworkActivity
和-stopNetworkActivity
直接在您傳遞的此對象的實例上,而不是使用通知。
問題1有一個簡單的答案,如果你走高一級並使用NSOperationQueue。向GCD提交一個塊實際上並不比GCD困難,它可以更好地控制操作。 – 2014-09-02 13:11:19
@PhillipMills謝謝,我將檢查文檔 – david 2014-09-02 13:19:08
@PhillipMills但第二個問題怎麼樣 – david 2014-09-02 13:19:30