我想通過iOS上的GCD派發一些代碼到主隊列,但即使是最簡單的測試也總是失敗。最後它歸結爲:調度到主隊列總是失敗
static const int TICK_INTERVAL = 1;
#pragma UIApplicationDelegate implementation
- (void) doTick
{
if (![NSThread isMainThread])
{
NSLog(@"Trying to dispatch . . .");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"test . . .");
});
}
}
- (void) startUpdate
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
timer_ = [NSTimer
scheduledTimerWithTimeInterval:TICK_INTERVAL
target:self
selector:@selector(backgroundUpdate)
userInfo:nil
repeats:NO
];
[[NSRunLoop currentRunLoop]
addTimer:timer_
forMode:NSRunLoopCommonModes
];
[[NSRunLoop currentRunLoop] run];
});
UIBackgroundTaskIdentifier back =
[[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^{
[self doTick];
[[UIApplication sharedApplication]
endBackgroundTask:back
];
}];
}
-(void)backgroundUpdate
{
[self doTick];
UIBackgroundTaskIdentifier back =
[[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^{
[self doTick];
[[UIApplication sharedApplication]
endBackgroundTask:back
];
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
timer_ = [NSTimer
scheduledTimerWithTimeInterval:TICK_INTERVAL
target:self
selector:@selector(backgroundUpdate)
userInfo:nil
repeats:NO
];
[[NSRunLoop currentRunLoop]
addTimer:timer_
forMode:NSRunLoopCommonModes
];
[[NSRunLoop currentRunLoop] run];
});
}
- (id) init
{
self = [super init];
[self startUpdate];
return self;
}
這就是我的AppDelegate
。 我希望在主線程中執行NSLog來記錄上面的測試文本,但沒有任何反應。 dispatch_sync
代碼只是永遠等待,我放在塊內的斷點永遠不會到達。
我確保代碼沒有在主線程中執行。在使用dispatch_sync
進行測試之前,我在我的應用中使用dispatch_async
進行了實驗,結果當然基本相同:沒有任何反應(沒有阻塞)。有趣的是,它似乎不適用於主隊列,其他隊列(當前隊列,全局隊列)似乎工作得很好。
我在我的應用程序中使用Phonegap(科爾多瓦),如果這是任何意義。
任何想法?
非常感謝!
使用'[NSThread isMainThread]'測試在主線程上第一個 –
我做了。請參閱我的改進示例。 – user1446796