iOS子线程中建立主线程更新UI

建立主线程的方法
1.NSThreadweb

[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
    
 - (void)updateUI {
    // UI更新代码
 }

2.NSOperationQueueasync

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// UI更新代码
}];

3.GCDsvg

dispatch_async(dispatch_get_main_queue(), ^{
        // UI更新代码
});

简单的使用spa

showLable = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 80)];
    [self.view addSubview:showLable];
    showLable.text = @"值改变前";
    showLable.backgroundColor = [UIColor redColor];
    //建立一个子线程
    NSOperationQueue *waitQueue = [[NSOperationQueue alloc] init];
    [waitQueue addOperationWithBlock:^{
        NSLog(@"%@",showLable.text);
        showLable.text = @"值改变了";
        NSLog(@"%@",showLable.text);
    }];

运行你会发现:
在这里插入图片描述
上面提示必须在主线程中执行线程

解决办法 :code

showLable = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 80)];
    [self.view addSubview:showLable];
    showLable.text = @"NSThread值改变前";
    showLable.backgroundColor = [UIColor redColor];
    //建立一个子线程
    NSOperationQueue *waitQueue = [[NSOperationQueue alloc] init];
    [waitQueue addOperationWithBlock:^{
        //NSThread
        [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
    }];
    
    UILabel * showLable1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 100 + 100 , 320, 80)];
    [self.view addSubview:showLable1];
    showLable1.text = @"NSOperationQueue值改变前";
    showLable1.backgroundColor = [UIColor redColor];
    //建立一个子线程
    NSOperationQueue *waitQueue1 = [[NSOperationQueue alloc] init];
    [waitQueue1 addOperationWithBlock:^{
        //NSOperationQueue
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            // UI更新代码
            showLable1.text = @"NSOperationQueue值改变了";
        }];
    }];
    
    UILabel * showLable2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 100 + 200, 320, 80)];
    [self.view addSubview:showLable2];
    showLable2.text = @"GCD值改变前";
    showLable2.backgroundColor = [UIColor redColor];
    //建立一个子线程
    NSOperationQueue *waitQueue2 = [[NSOperationQueue alloc] init];
    [waitQueue2 addOperationWithBlock:^{
        //GCD
        dispatch_async(dispatch_get_main_queue(), ^{
            // UI更新代码
            showLable2.text = @"GCD值改变了";
        });
    }];
   
    

- (void)updateUI {
    // UI更新代码
    showLable.text = @"NSThread值改变了";
}

如图:
在这里插入图片描述orm