0

第一篇文章 - 请温柔。

我正在尝试将远程控制应用程序从 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;
    //       }

}
4

1 回答 1

0

当您想从后台线程更新 UI 时,您需要将调度异步调用到主线程(这是处理所有 UI 的地方)。

dispatch_async(dispatch_get_main_queue(), ^(void){
    NSLog(@"I can update UI elements here!");
});
于 2014-03-23T20:55:03.010 回答