Obecnie pracuję przy założeniu, że -performSelector:withObject:afterDelay:
nie używa wątków, ale planuje zdarzenie do uruchomienia w późniejszym terminie w bieżącym wątku. Czy to jest poprawne?W jaki sposób -performSelector: withObject: afterDelay: work?
Bardziej konkretnie:
- (void) methodCalledByButtonClick {
for (id obj in array) {
[self doSomethingWithObj:obj];
}
}
static BOOL isBad = NO;
- (void) doSomethingWithObj:(id)obj {
if (isBad) {
return;
}
if ([obj isBad]) {
isBad = YES;
[self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1];
return;
}
//Do something with obj
}
- (void) resetIsBad {
isBad = NO;
}
To jest zagwarantowane, że -resetIsBad
nie zostanie wywołana dopiero po -methodCalledByButtonClick
zwrotów, zakładając, że są wyświetlane w głównym wątku, nawet jeśli -methodCalledByButtonClick
bierze dowolnie długo, aby zakończyć?
Czy jest zagwarantowane, że opóźnienie o wartości 0 nadal nie spowoduje natychmiastowego uruchomienia? Doktorzy mówią "niekoniecznie", ale to coś innego niż "koniecznie nie", więc jestem ciekawy. –
To zawsze działało w ten sposób z mojego doświadczenia, ale dobry punkt. Nie wiem, czy jest to gwarantowane. –
Miałem ten sam problem i to działało dla mnie [self performSelector: @selector (showLoginScreen) withObject: nil afterDelay: 1.0]; –