E 'generalmente una buona idea di chiamare -[NSRunLoop runUntilDate:]
? Sembra funzionare senza problemi, ma mi rende nervoso dire al ciclo di esecuzione di essere eseguito all'interno del ciclo di esecuzione.Sta chiamando - [NSRunLoop runUntilDate:] una buona idea?
Maggiori informazioni:
Ho un progetto in questo momento che è il recupero dei dati da un servizio REST. Un'unica informazione fondamentale che è necessario ottenere è l'intervallo di date con dati validi. E 'un po' piccolo di dati che ha solo bisogno di essere diventato una volta, così ho deciso che il modo migliore per gestire la cosa è di avere la proprietà scaricare i dati se la variabile locale è nil
. Sto usando ASIHTTPRequest
e un ASINetworkQueue
, quindi tutto è asincrono per impostazione predefinita e in ordine per far funzionare tutto questo, questa proprietà non posso tornare fino a quando i dati sono stati scaricati ed elaborati. Ecco un profilo del mio codice, i nomi delle variabili sono stati cambiati per proteggere gli innocenti:
__block BOOL isWorking = YES;
__block ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:/*actual URL*/] autorelease];
[request setCompletionBlock:^{
// set local variable
isWorking = NO;
}];
[request setFailedBlock:^{
// show alert to user
isWorking = NO;
}];
[queue addOperation:request];
while (isWorking) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}
Ancora una volta, questo sembra funzionare bene. Ci sono potenziali problemi con l'utilizzo di questo approccio?
Quindi, in questo caso, sembra che questo approccio è sicuro dal momento che non c'è niente altro che potrebbe chiamare questa proprietà mentre è impegnata a scaricare i dati. Ma se ci fosse una situazione in cui l'utente potrebbe premere un pulsante mentre era occupato e richiamare di nuovo quella proprietà, allora esploderebbe? Buono a sapersi. –
Questa proprietà viene utilizzata direttamente o indirettamente da qualsiasi metodo o delegato dell'interfaccia utente? Se è così, è ancora un grosso problema. – hotpaw2
Sono certo sarà solo colpire questo codice una volta quando l'applicazione carica inizialmente prima che l'interfaccia utente è ancora presentato all'utente. Dopodiché, i dati saranno lì e useranno la variabile locale. Se non riesce a scaricare i dati per qualche motivo, visualizza un avviso modale per l'utente e non possono accedere all'app fino a quando non viene scaricata correttamente. –