我有一个 GUI 逻辑所在的视图控制器
我有一个从这个视图控制器开始的线程,我正在做一些处理
我有两个视图,我想在一段时间后从我的线程中翻转
据我所知,我们只能从视图控制器进行翻转
所以请建议我一种从我的自定义线程类中调用视图控制器方法的方法。
提前致谢
我有一个 GUI 逻辑所在的视图控制器
我有一个从这个视图控制器开始的线程,我正在做一些处理
我有两个视图,我想在一段时间后从我的线程中翻转
据我所知,我们只能从视图控制器进行翻转
所以请建议我一种从我的自定义线程类中调用视图控制器方法的方法。
提前致谢
所以我想到的第一个选择是:
如果您可以从线程类访问视图控制器,那么您可以这样做:
dispatch_async(dispatch_get_main_queue(), ^{
[yourVc callMethodToFlip];
});
如果您无权访问,则可以使用通知:
你的VC.m
-(void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(methodForFlip) name:A_NOTIFICATION_NAME object:nil];
}
InYourTreadClass.m
-(void)someMethodThatExecutesAsync {
//dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter]
postNotificationName:A_NOTIFICATION_NAME
object:nil]; //or yoou can send an object
});
}
另一种方法是,为您的自定义线程类创建一个采用块参数的方法,每当您从 vc 创建线程时,发送块参数,该参数也将从您的线程调用dispatch_async
您应该使用 Grand Central Dispatch (GCD) 来执行异步操作。这样你就可以在主线程之外执行密集的操作,然后回到主线程用这个简单的语法来执行你的动画:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{
//Calculations
dispatch_async(dispatch_get_main_queue(), ^{
//Do animations
});
});
在你的线程类中,添加一个指向你的视图控制器的指针:
@property (nonatomic, assign) YourViewController *viewController;
当您的视图控制器创建线程时,将线程的viewController
属性设置为您的视图控制器:
yourThreadClass.viewController = self;
在您的 View Controller 类中,创建一个flipViews
方法:
-(void)flipViews
{
// ...
}
在您的线程类中,每当需要翻转视图时,只需调用:
[viewController performSelectorOnMainThread:@selector:(flipViews) withObject:nil waitUntilDone:YES];