0

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

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

2 回答 2

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.."];
        }
    }
});
于 2013-05-01T15:29:53.937 回答
0

您完成这一系列更新的速度有多快?如果它快于一秒钟,您不太可能看到所有这些。

让他们等到完成不太可能影响任何事情,因为无论如何绘图都是异步完成的。

请注意,您的方法名称是非常规的;方法不应以getand为前缀,saveUsersInformation::不鼓励使用(尝试类似saveUsersInformationToDevice:usingDTO:)。


更新文本字段的调用之间经过了多少时间?整个过程需要一分钟,但是那个时间是怎么划分的呢?

您的主要事件循环在做什么?模态运行还是正常运行?

于 2013-05-01T15:28:37.527 回答