第一篇文章 - 请保持温和。
我正在尝试将远程控制应用程序从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;
// }
}
答案 0 :(得分:0)
如果要从后台线程更新UI,则需要将调度异步调用到主线程(这是处理所有UI的位置)。
dispatch_async(dispatch_get_main_queue(), ^(void){
NSLog(@"I can update UI elements here!");
});