如何在另一个线程中的代码块完成后执行任务

时间:2015-11-24 05:34:41

标签: ios objective-c multithreading nsthread

对于这个令人困惑的标题感到抱歉,我有这个代码块在自己的线程中运行,并希望每次更改其值时访问另一个类(视图控制器)中的类变量。

为了澄清我的问题,这是一个简单的类结构,代表我正在努力实现的目标。

@interface classB : NSObject 
{
  NSThread * _someThread;
}

+ (classB*) instance;

@property(atomic) CVPixelBufferRef pixBufB;

- (void) foo
{
  while(1) 
  {

  //decode a frame

  //assign data to pixBufB

  }
}

- (void) start
{
  _someThread = [[NSThread alloc] initWithTarget:self selector:@selector(foo) object:nil];
}

//sampleViewController 

@interface sampleViewController : UIViewController

@property(atomic) CVPixelBufferRef pixBuf;

- (void)viewDidLoad
{
        [[classB instance] start];
}

- (void) bar 
{
    _pixBuf =  [[classB instance] pixBufB];
}

在foo的每个循环周期结束时,我想访问sampleViewController类中的_pixBufB。由于foo是在另一个线程中执行的,我不能简单地使用getter,有没有人知道如何处理这个问题?

由于

2 个答案:

答案 0 :(得分:0)

您可以使用NSOperationNSOperationQueue来完成这项工作。你可以"任务"赋值给NSOperation的子类并覆盖main方法来编写任务。接下来,你需要创建一个NSOperationQueue的对象并添加你的子类,它将开始在你创建的新队列中运行,你可以分别创建为同步和异步。

现在您可以在队列末尾或NSOperation本身添加一个onCompletion Block,它将被执行。或者您可以创建另一个NSOperation的子类,并创建您要执行的任务(foo,此处)作为另一个任务,并使用First TASK创建addDependency,因此将执行第二个任务(foo)只有在第一次完成后才会这样。

有关NSOperation和NSOperationQueue的更多信息,您可以访问此link

答案 1 :(得分:0)

让线程在您想要进行更新的每个点上调用一个块。可以将块调度到要调用的主队列,也可以在更新任何视图控制器状态之前将其调度到主队列。