我想创建NSOperationQueue
,NSOperatioQueue
应该刷新UILable
,我创建了这段代码:
NSOperationQueue * ramQueue = [NSOperationQueue alloc];
[ramQueue addOperationWithBlock:^{
while (TRUE) {
//Creating String
NSOperationQueue *main = [NSOperationQueue mainQueue];
[main addOperationWithBlock:^{
//Refresh Label
}];
}
}];
但它不起作用,标签不显示新的字符串。在这里显示错误:[ramQueue addOperationWithBlock:^{
任何人都知道如何解决这个问题?
答案 0 :(得分:1)
好的,我想感谢Rob,指出我正确的方向!
这是我正确的代码:
首先,我创建了[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(updateRam) userInfo:nil repeats:YES];
而不是while(TRUE){}
循环。然后我纠正了我的NSOperationQueue
代码:
-(void)updateRam {
NSOperationQueue * ramQueue = [[NSOperationQueue alloc] init];
[ramQueue addOperationWithBlock:^{
//Create String
NSOperationQueue *main = [NSOperationQueue mainQueue];
[main addOperationWithBlock:^{
//Refresh Label
}];
}];
}
非常感谢!
答案 1 :(得分:0)
有几点想法:
[NSOperationQueue alloc]
应为[[NSOperationQueue alloc] init]
。
我通常会建议不要结束while
循环。如果你想反复做某事,重复计时器(以合理的速度,可能不超过每秒10-20次)可能是一个更好的结构。如果使用while
循环结构,则可以很容易地将操作发布到主队列,而不是主循环可以处理它们。 (这取决于while
循环内部的内容。)
如果你继续使用那个while
循环(再次,我不鼓励你这样做),你可能想要一个@autoreleasepool
,所以任何自动释放的对象都会被释放。
[ramQueue addOperationWithBlock:^{
while (TRUE) {
@autoreleasepool {
//Creating String
NSOperationQueue *main = [NSOperationQueue mainQueue];
[main addOperationWithBlock:^{
//Refresh Label
}];
}
}
}];
您甚至可能希望使用信号量来确保后台操作不会过快地发布事件。
可能与您的问题无关,但如果您正在执行任何更新任何共享资源(例如更改任何类属性或ivars)的操作,请确保将这些资源与主队列同步。您可以通过将这些更新分发回主队列或使用某种锁定机制来实现。