从线程调用视图控制器的方法

时间:2013-08-09 15:00:58

标签: ios

我有一个GUI逻辑所在的视图控制器

我有一个从这个视图控制器启动的线程,我正在做一些处理

我有两个观点,我想在一段时间后从我的线程中翻转

据我所知,我们只能从视图控制器中翻转

所以请建议我从我的自定义线程类中调用视图控制器的方法。

提前致谢

3 个答案:

答案 0 :(得分:1)

您应该使用Grand Central Dispatch(GCD)来执行异步操作。这样你就可以从主线程执行密集操作,然后回到主线程来用这个简单的语法执行你的动画:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{
        //Calculations
    dispatch_async(dispatch_get_main_queue(), ^{
            //Do animations
    });
});

答案 1 :(得分:1)

因此,我想到的第一个选择是:

如果您可以从线程类访问视图控制器     然后你可以这样做:

  dispatch_async(dispatch_get_main_queue(), ^{
    [yourVc callMethodToFlip];  
  });

如果您无权访问,则可以使用通知:

<强> YourVC.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 < / p>

答案 2 :(得分:0)

在你的线程类中,添加一个指向视图控制器的指针:

@property (nonatomic, assign) YourViewController *viewController;

当您的视图控制器创建线程时,将线程的viewController属性设置为视图控制器:

yourThreadClass.viewController = self;

在View Controller类中,创建flipViews方法:

-(void)flipViews
{
    // ...
}

在你的线程类中,只要需要翻转视图,只需调用:

[viewController performSelectorOnMainThread:@selector:(flipViews) withObject:nil waitUntilDone:YES];