0

我喜欢创建一个NSOperationQueueNSOperatioQueue应该刷新一个UILable,我创建了这个代码:

NSOperationQueue * ramQueue = [NSOperationQueue alloc];
    [ramQueue addOperationWithBlock:^{
        while (TRUE) {

            //Creating String

            NSOperationQueue *main = [NSOperationQueue mainQueue];
            [main addOperationWithBlock:^{

                //Refresh Label

            }];

        }

    }];

但它不起作用,标签没有显示新的字符串。is 在这里显示错误:[ramQueue addOperationWithBlock:^{

有人知道怎么修这个东西吗?

4

2 回答 2

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

        }];

    }];
}

谢谢阿甘!

于 2013-09-26T19:05:50.827 回答
0

几个想法:

  1. [NSOperationQueue alloc]应该是[[NSOperationQueue alloc] init]

  2. 我通常建议不要使用永无止境的 while循环。如果您想重复做某事,重复计时器(以合理的速率,可能不超过每秒 10-20 次)可能是一个更好的结构。如果您使用while循环结构,您很容易最终将操作发布到主队列,速度快于主循环处理它们的速度。(这取决于该while循环内的内容。)

  3. 如果您继续使用该while循环(同样,我不鼓励您这样做),您可能需要一个@autoreleasepool内部循环,以便释放任何自动释放的对象。

    [ramQueue addOperationWithBlock:^{
        while (TRUE) {
            @autoreleasepool {
                //Creating String
    
                NSOperationQueue *main = [NSOperationQueue mainQueue];
                [main addOperationWithBlock:^{
    
                    //Refresh Label
                }];
            }
        }
    }];
    

    您甚至可能希望使用信号量来确保后台操作不会过快发布事件。

  4. 可能与您的问题无关,但如果您正在更新任何共享资源(例如更改任何类属性或 ivars),请确保将这些与主队列同步。您可以通过将这些更新分派回主队列或采用某种锁定机制来做到这一点。

于 2013-09-25T21:35:00.460 回答