我正在尝试在不同的任务正在进行时更新标签。我搜索并使用了不同的选项并使用这种方式结束,但它仍然不起作用:
[processStatusLable performSelectorOnMainThread:@selector(setText:) withObject:@"Creating your account..." waitUntilDone:NO];
DCConnector *dccon = [DCConnector new];
ContactsConnector *conCon = [ContactsConnector new];
if (![dccon existUsersData]) {
[dccon saveUsersInformation:device :usDTO];
//created account
//get friends -> Server call
[processStatusLable performSelectorOnMainThread:@selector(setText:) withObject:@"Checking for friends..." waitUntilDone:NO];
NSMutableArray *array = [conCon getAllContactsOnPhone];
// save friends
[processStatusLable performSelectorOnMainThread:@selector(setText:) withObject:@"Saving friends.." waitUntilDone:NO];
if ([dccon saveContacts:array]) {
[processStatusLable performSelectorOnMainThread:@selector(setText:) withObject:@"Friends saved successfully.." waitUntilDone:NO];
}
}
最后performSelector
正在执行(至少我看到视图上的标签文本已更改),但所有其他选择器都无法正常工作。知道为什么吗?
编辑1
- (void)updateLabelText:(NSString *)newText {
processStatusLable.text = newText;
}
答案 0 :(得分:3)
我们可以使用以下代码在主线程上运行一些东西,
dispatch_async(dispatch_get_main_queue(), ^{
//set text label
});
使用它我们可以编写这样的方法,
- (void)updateLabelText:(NSString *)newText {
dispatch_async(dispatch_get_main_queue(), ^{
processStatusLable.text = newText;
});
}
最后,您可以这样使用更改代码,
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self updateLabelText:@"Creating your account..."];
DCConnector *dccon = [DCConnector new];
ContactsConnector *conCon = [ContactsConnector new];
if (![dccon existUsersData]) {
[dccon saveUsersInformation:device :usDTO];
//created account
//get friends -> Server call
[self updateLabelText:@"Checking for friends..."];
NSMutableArray *array = [conCon getAllContactsOnPhone];
// save friends
[self updateLabelText:@"Saving friends.."];
if ([dccon saveContacts:array]) {
[self updateLabelText:@"Friends saved successfully.."];
}
}
});
答案 1 :(得分:0)
您运行这一系列更新的速度有多快?如果它快于一秒钟,你就不太可能看到所有的'。
让他们等到完成不太可能影响任何事情,因为无论如何绘图是异步完成的。
请注意,您的方法名称是非常规的;方法不应以get
为前缀,不鼓励使用saveUsersInformation::
(尝试类似saveUsersInformationToDevice:usingDTO:
)。
更新文本字段的调用之间经过了多长时间?整个过程需要一分钟,但那个时间如何分开?
你的主要事件循环是什么?运行模式还是正常运行?