2013-05-01 2 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 становится казнены (по крайней мере, я вижу текст метки изменился на взгляд), но все остальные селекторы не работают. Любая идея почему?

EDIT 1

- (void)updateLabelText:(NSString *)newText { 
    processStatusLable.text = newText; 
} 
+0

Попробуйте waitUntilDone: ДА, + если вы можете загрузить методы, которые вы вызываете из @selector, было бы здорово ... –

+1

возможно, он отображается в UILabel, но он меняется слишком быстро? –

+0

он не должен обрабатывать минутку – SaifDeen

ответ

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

+0

плохо попробуйте обновленный код – SaifDeen

+0

Да, попробуйте это и дайте мне знать результат мой друг –

0

Как быстро запустить через эту последовательность обновлений? Если это быстрее, чем секунда, вы вряд ли увидите все.

Заставить их ждать, пока не закончится, вряд ли повлияет на что-либо, поскольку рисунок выполняется асинхронно в любом случае.

Обратите внимание, что имена ваших методов нетрадиционные; методы не должны иметь префикса get и saveUsersInformation:: не рекомендуется (попробуйте что-то вроде saveUsersInformationToDevice:usingDTO:).


Сколько времени проходит между вызовами для обновления текстового поля? Весь процесс занимает минуту, но как это время делится?

Какова ваша основная циновка событий в противном случае? Запуск модально или работает нормально?

+0

как я написал выше, процесс занимает минуту – SaifDeen

+0

Как долго занимаются отдельные части? – bbum