更新主线程上的标签不起作用

时间:2013-05-01 15:19:02

标签: iphone ios objective-c uiviewcontroller performselector

我正在尝试在不同的任务正在进行时更新标签。我搜索并使用了不同的选项并使用这种方式结束,但它仍然不起作用:

[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;
}

2 个答案:

答案 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:)。


更新文本字段的调用之间经过了多长时间?整个过程需要一分钟,但那个时间如何分开?

你的主要事件循环是什么?运行模式还是正常运行?