Sto scrivendo un modulo iOS che attualmente invia un'email in modo asincrono (usando i delegati). Usa SKPSMTPMessage
che funziona benissimo. Il mio problema è che il cliente vuole che il codice blocchi completamente il thread fino a quando l'email non è stata inviata (o non è stata inviata). Quindi stanno praticamente chiedendo una soluzione sincrona, quando attualmente tenterà di inviare l'e-mail e quindi di tornare da quel blocco di codice prima che l'e-mail sia stata inviata.Wrapping di chiamate asincrone in un thread di blocco sincrono?
Quindi, invece di provare a riscrivere il codice SKPSMTPMessage
in modo sincrono (non sembra esserci alcuna opzione sincrona per esso), spero di trovare un modo per avvolgere quel blocco di codice asincrono nella sua stessa discussione e magari fare in modo che il thread principale attenda che finisca completamente (delegati e tutti).
Ho provato un paio di metodi diversi utilizzando NSOperation
s e NSThread
ma forse io non sto facendo qualcosa di giusto, perché ogni volta che provo a bloccare il thread principale, il delegato asincrono chiama ancora non sembrano mai finire (fare ritornano sul filo principale o qualcosa del genere?).
Qualsiasi informazione o anche altre idee apprezzate.
PS ~ Mi rendo conto che questo è un po 'indietro. Nella maggior parte dei casi, asincrono sembra essere la strada da percorrere, ma questo è un caso speciale e il cliente ha le sue ragioni per volerlo.
MODIFICA: Grazie per tutti gli input. Come suggerito da una delle risposte, ho finito solo utilizzando un ciclo while che aspettava i delegati per tornare ancora lasciare che il runloop continuare così in questo modo:
while(![messageDelegate hasFinishedOrFailed]){
// Allow the run loop to do some processing of the stream
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
Sì, sembra che sia sempre di più quello che devo fare e tuttavia il codice è distribuito tra diversi metodi. Posso dire che provare a spostare le cose in modo che tutto avvenga in modo sincrono sarà un dolore. Sembra che se in qualche modo prenda l'analisi runLoop dall'equazione, ciò aiuterebbe. Suppongo che speravo di racchiudere semplicemente il blocco di codice in un thread separato ... quindi il ciclo di esecuzione non sarebbe eseguito in quel thread e non nel thread principale? Non sembra essere il caso però – valheru
Grazie, ma come ho postato come commento ad un'altra possibile risposta, il modulo non dovrebbe avere alcun accesso all'interfaccia utente stessa perché sarà incluso in app separate. È pensato per essere più di un processo in background in sé che si avvia semplicemente all'avvio dell'app e al termine dà il pieno controllo all'app. – valheru
Se si crea un nuovo thread, il ciclo di esecuzione non viene eseguito automaticamente; deve essere avviato manualmente. Penso che mettere la messaggistica in background sia l'unica possibilità, però. Vedi il mio aggiornamento per un possibile modo per farlo. –