2013-05-01 29 views
0

正在尝试更新标签,同时执行不同的任务。我搜索,用这种方式使用不同的选项和endup但它仍然无法正常工作:正在更新主线程上的标签不起作用

[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

尝试waitUntilDone:是的,如果你可以上传你从@selector调用的方法,那将是非常棒的... – 2013-05-01 15:22:04

+1

也许它在UILabel中显示,但它变化太快? – 2013-05-01 15:24:36

+0

它不应该这个过程需要像一分钟 – SaifDeen 2013-05-01 15:26:09

回答

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.."]; 
     } 
    } 
}); 
+0

我用第3个performSelector替换了它,并且它在所有方法 – SaifDeen 2013-05-01 15:42:04

+0

生病后尝试更新代码 – SaifDeen 2013-05-01 15:43:24

+0

是的,试试这个并让我知道结果我的朋友 – 2013-05-01 15:44:24

0

速度有多快,你通过更新这个序列运行?如果它比一秒快,你不可能看到他们所有的。

让他们等待直到完成不会影响任何东西,因为绘图是异步完成的。

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


多少时间流逝的调用来更新文本字段之间?整个过程需要一分钟,但时间又是如何分配的?

你的主要事件循环做了什么?模态运行或正常运行?

+0

正如我上面写的,这个过程需要像一分钟 – SaifDeen 2013-05-01 15:31:56

+0

多久各个部分走? – bbum 2013-05-01 16:03:33