2013-05-01 65 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