Ios 如何在Objective-C中使用背景线程?
我尝试运行while循环时 按下按钮,但我无法按下按钮,因为while循环会阻塞UI 是否有后台线程可以运行while循环并按下Ios 如何在Objective-C中使用背景线程?,ios,objective-c,multithreading,Ios,Objective C,Multithreading,我尝试运行while循环时 按下按钮,但我无法按下按钮,因为while循环会阻塞UI 是否有后台线程可以运行while循环并按下ui按钮??试试这个 dispatch_async(dispatch_get_main_queue(), ^{ // your code }); 一旦它发出,您将无法完全控制操作。 如果你想控制操作。使用 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperationWit
ui按钮?
?试试这个
dispatch_async(dispatch_get_main_queue(), ^{
// your code
});
一旦它发出,您将无法完全控制操作。
如果你想控制操作。使用
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
// Background work
}];
您有很多选择,Grand Central Dispatch是一个不错的选择,或者您可以使用NSTimer每隔x毫秒在后台触发一个事件,这也可能对您有用
dispatch_async(dispatch_get_main_queue(), ^{
// your code
});
或
就个人而言,我会在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。您必须在后台线程中运行循环,而UI更新必须在主线程中完成。下面是一个方法1:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Write your code here
});
[NSThread detachNewThreadSelector:@selector(yourMethod:) toTarget:self withObject:nil];
方式2:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Write your code here
});
[NSThread detachNewThreadSelector:@selector(yourMethod:) toTarget:self withObject:nil];
如果使用performSelectorInBackground:withObject:
生成新线程
方式3:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Write your code here
});
[NSThread detachNewThreadSelector:@selector(yourMethod:) toTarget:self withObject:nil];
查看此页面:还可以阅读关于如果我使用
dispatch\u async
启动后台工作,如何结束此工作?一旦它在队列中调度,您将无法控制您的代码。把你的while循环放进去。如果我用dispatch_async开始后台工作,我该如何结束这项工作?@Martin:你必须使用“合作取消”:声明你可以从外部更改为“你应该停止工作”和块内定期检查该状态的代码。如果您添加NSOperation用法,并包含在每个方法的主线程和后台线程之间移动的重要概念,这将是一个更好的答案。