我试图在按下按钮时运行while循环,但由于while循环阻塞了UI,所以无法按下按钮。
是否有后台线程可以运行while循环,并同时按下UIButton
?
我试图在按下按钮时运行while循环,但由于while循环阻塞了UI,所以无法按下按钮。
是否有后台线程可以运行while循环,并同时按下UIButton
?
就我个人而言,我会在UI的顶部运行一个HUD活动指示器,然后在后台运行你的循环。
//Start the HUD here
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Run your loop here
dispatch_async(dispatch_get_main_queue(), ^(void) {
//stop your HUD here
//This is run on the main thread
});
});
方法一:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Write your code here
});
方法2:
如果你使用performSelectorInBackground:withObject:
来创建一个新的线程。
方法3:
[NSThread detachNewThreadSelector:@selector(yourMethod:) toTarget:self withObject:nil];
试试这个
dispatch_async(dispatch_get_main_queue(), ^{
// your code
});
一旦它被分派,您将不能完全控制操作。 如果您想控制该操作,请使用
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
// Background work
}];
dispatch_async
开始后台工作,如何结束这项工作? - Martin对于您来说,有很多选择。Grand Central Despatch 是一个不错的选择,或者您可以使用 NSTimer 在后台每 x 毫秒触发一个事件,这也可能适合您。
dispatch_async(dispatch_get_main_queue(), ^{
// your code
});
或者
NSTimer *refreshTimer;
refreshTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(YourMethodHere) userInfo:nil repeats:YES];
我想分享一下,针对并发队列有不同的优先级级别、它们的服务质量等效性以及时间安排方面有用的(尽管是主观的)推荐使用场景。更多信息可以在苹果文档中找到。
Global queue | Corresponding QoS class | Description
--------------------------------------------------------------------------
Main thread | User-interactive | Instantaneous
DISPATCH_QUEUE_PRIORITY_HIGH | User-initiated | <= 3s
DISPATCH_QUEUE_PRIORITY_DEFAULT | Default | 3s - 10s
DISPATCH_QUEUE_PRIORITY_LOW | Utility | 3s - 3m
DISPATCH_QUEUE_PRIORITY_BACKGROUND | Background | > 3m
为了完整性,还有一个unspecified
QoS,但它仅用于支持旧版API。
一些例子:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{});