对于这个令人困惑的标题感到抱歉,我有这个代码块在自己的线程中运行,并希望每次更改其值时访问另一个类(视图控制器)中的类变量。
为了澄清我的问题,这是一个简单的类结构,代表我正在努力实现的目标。
@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,有没有人知道如何处理这个问题?
由于
答案 0 :(得分:0)
您可以使用NSOperation
和NSOperationQueue
来完成这项工作。你可以"任务"赋值给NSOperation的子类并覆盖main
方法来编写任务。接下来,你需要创建一个NSOperationQueue
的对象并添加你的子类,它将开始在你创建的新队列中运行,你可以分别创建为同步和异步。
现在您可以在队列末尾或NSOperation本身添加一个onCompletion Block,它将被执行。或者您可以创建另一个NSOperation
的子类,并创建您要执行的任务(foo,此处)作为另一个任务,并使用First TASK创建addDependency
,因此将执行第二个任务(foo)只有在第一次完成后才会这样。
有关NSOperation和NSOperationQueue的更多信息,您可以访问此link
答案 1 :(得分:0)
让线程在您想要进行更新的每个点上调用一个块。可以将块调度到要调用的主队列,也可以在更新任何视图控制器状态之前将其调度到主队列。