IOS dispatch_async将NSString从线程传递到主视图

时间:2014-03-23 20:50:43

标签: ios dispatch-async

第一篇文章 - 请保持温和。

我正在尝试将远程控制应用程序从Android移植到iPhone,并且在主视图中使用dispatch_async进行内部线程通信时遇到一些困难。

应用程序有一个单独的ControlPanel类,负责与远程客户端的通信。 ControlPanel通信对象被实例化为后台线程,它负责处理设备的连续网络通信,我需要后台线程将简单的文本字符串传递给UI线程 - 更新文本字段。

我看了很多例子,但似乎都没有处理定义,而且我已经围绕这个问题进行了讨论。如何在ControlPanel类中定义方法?我尝试了各种方法来定义,但没有取得任何进展。我错过了一些简单的事吗?建议使用viewDidLoad中的updateKeypadDisplay作为执行此操作的方法,但我不太了解语法,无法查看我出错的地方。

/*  
 *   In the ControlPanel.m class the thread does stuff and wants to update the UI:
 */

NSString * kpString = @"String Updated By Process";

dispatch_async(dispatch_get_main_queue(), ^{
    self.updateKeypadDisplay(kpString);    // << This call gives an error - property not found on object of type ControlPanel                          
});


/*  
 *   In the ControlPanel.h header :
 */
- (void)updateKeypadDisplay:(void (^)(NSString *kpString))block;




/*  
 *   In the ViewController .m
 */
- (void)viewDidLoad
{
    [super viewDidLoad];
    kpdisplay.text = @"Initial String";
    backgroundQueue = dispatch_queue_create("com.sss.tt.bgqueue", NULL);  

    dispatch_async(backgroundQueue, ^{
        self.panelobj = [[ControlPanel alloc ]init];
        [self.panelobj connectPanel];
    });

    //   This was suggested as the way to define the method to update the main UI kpdisplay text field, but
    //    I cannot get the syntax right.   I'm also unsure the definitions are correct in the headers.
    //
    //       [ControlPanel updateKeypadDisplay::^(NSData *kpString) {
    //       self.kpdisplay.text = kpString;
    //       }

}

1 个答案:

答案 0 :(得分:0)

如果要从后台线程更新UI,则需要将调度异步调用到主线程(这是处理所有UI的位置)。

dispatch_async(dispatch_get_main_queue(), ^(void){
    NSLog(@"I can update UI elements here!");
});