/ / в цел-в, сън се случва преди код преди него - цел-в

в цел-в, сънът се случва преди кода преди него - цел-с

В този код изглежда, че сънят се случва преди скриването на един бутон. Защо така?

-(void)buttonPressed{
NSLog(@"Button pressed!");
button.hidden=true;
sleep(rand()%10);
NSLog(@"out of sleep!");
}

Отговори:

8 за отговор № 1

Настройката на "скритата" се случва незабавно и задейства a SetNeedsDisplay , която върви в цикъла на изпълнение. След това методът спи. Тогава след сън се изпълнява цикъла на изпълнение и дисплеят се актуализира. Така че само сънят предотвратява актуализирането на дисплея, докато не свърши сънят.


1 за отговор № 2

Предполагам, че е така hidden собствеността бе успешно зададена, но екранът не бе актуализиран, защото сте спрели нишката.

Екранът ще се актуализира по-късно.


1 за отговор № 3

Нямам никакви конкретни обективни познанияна тази точка - но е общоприето, че UI е единична резба и че актуализирането на състоянието на вашия бутон е поставено на опашка за изпълнение. Обаждането за сън след това спира всички текущи теми и поради това спира актуализацията на потребителския интерфейс.


0 за отговор № 4

SetNeedsDisplay по същество определя флага, който щезащото контролът трябва да бъде пренасочен следващия път около цикъла на потребителския интерфейс. То няма да влезе в сила незабавно, тъй като обикновено се отлага леко, за да се обединяват различни освежавания на потребителския интерфейс.

Извършването на повикване за сън () в нишка на потребителския интерфейс наистина е намръщен при ... ако искате да извършите някакво действие n ms след като скриете бутона, бих препоръчал да се обадите performSelector:withObject:afterDelay:, по тази тема:

Как да използвате performSelector: withObject: afterDelay: с примитивни типове в какао?

По принцип искате да имате възможно най-малко блокиращ блок за потребителски интерфейс, тъй като всеки блокиращ код (например сън) ще накара потребителския интерфейс да закъснее, по принцип да не реагира или да плава с топка (SPoD).