Desidero creare un gestore di completamento per una determinata classe, invece di attivare il codice principale della classe e attendere una richiamata delegata. Ho letto la documentazione di Apple e non sembrano dare un buon esempio di come implementare direttamente qualcosa di simile.Come creare il proprio gestore di completamento come parte dei parametri del metodo
risposta
È necessario considerare il blocco di completamento come una variabile. Il metodo accetta un blocco come parte dei suoi parametri, quindi lo memorizza per dopo.
- (void)myMethodWithCompletionHandler:(void (^)(id, NSError*))handler;
È possibile typedef che tipo di blocco per una più facile lettura:
typedef void (^CompletionBlock)(id, NSError*);
e quindi memorizzare il tuo blocco come una variabile di istanza:
Nel vostro @interface: CompletionBlock _block;
Nel mio metodo .. _block = [handler copy]
Poi, quando si desidera che il blocco di completamento da eseguire appena lo chiamano come un blocco normale:
_block(myData, error);
Se fosse stato per un metodo asincrono Si potrebbe fare in questo modo
- (void)asynchronousTaskWithCompletion:(void (^)(void))completion;
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Some long running task you want on another thread
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) {
completion();
}
});
});
}
invocato con
[self asynchronousTaskWithCompletion:^{
NSLog(@"It finished");
}];
Qualcosa da non E è la guardia per assicurarsi che completion
stia puntando a qualcosa altrimenti andremo in crash se proviamo ad eseguirlo.
Un altro modo in cui utilizzo spesso i blocchi per i gestori di completamento è quando un viewController è terminato e desidera essere estratto da uno stack di navigazione.
@interface MyViewController : UIViewController
@property (nonatomic, copy) void (^onCompletion)(void);
@end
@implementation MyViewController
- (IBAction)doneTapped;
{
if (self.onCompletion) {
self.onCompletion();
}
}
@end
si dovrebbe impostare il blocco di completamento quando si spinge questo punto di vista nello stack
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
{
MyViewController *myViewController = segue.destinationViewController;
myViewController.onCompletion = ^{
[self.navigationController popViewControllerAnimated:YES];
};
}
non risponderebbe alla seconda chiamata di chiamata asincrona prima del completamento dell'attività a esecuzione prolungata? – marciokoko
Come sarebbe? Se il codice long non è stato completato, non avrai raggiunto il prossimo 'dispatch_async' –
Sì perché è in un altro thread, non è vero? – marciokoko
risposta di Chris C è corretta (ed è stato molto utile per me) con un avvertimento:
Posizionamento del declaration CompletionBlock _block;
in @interface
non è thread-safe.
Inserire CompletionBlock _block = [handler copy];
in myMethod…
invece se è possibile che myMethod…
venga chiamato da più thread (o code di invio).
Grazie @ Chris C.
Ecco un esempio di un metodo che accetta una stringa e un gestore di completamento come variabili. Il gestore di completamento può anche ricevere una stringa.
Swift 2.2 Sintassi
Defintion:
func doSomething(input: String, completion: (result: String) -> Void {
print(input)
completion(result: "we are done!")
}
Chiamando la funzione:
doSomething("cool put string!") { (result) in
print(result)
}
- 1. Come attendere il completamento del metodo async?
- 2. Cosa indicano tre punti (...) quando usati come parte dei parametri durante la definizione del metodo?
- 3. Come ottenere suggerimenti/completamento dei parametri in Visual Studio?
- 4. Come utilizzare CDI per l'iniezione dei parametri del metodo?
- 5. Come creare il proprio parser SQL?
- 6. Come creare il proprio dotnet offfuscator
- 7. Come creare il proprio simbolo matematico laTex?
- 8. Come creare il proprio database in redis?
- 9. Perché creare il proprio CMS?
- 10. Creare un metodo ruby che accetta un hash dei parametri
- 11. Modifica oggetto mutabile nel gestore di completamento
- 12. Come funziona un gestore di completamento su iOS?
- 13. tinymce 4: come creare il proprio file manager?
- 14. Come creare proprio tasto sulla tastiera virtuale
- 15. Tipo di generics Java cancellazione dei parametri del metodo
- 16. Completamento gestore in Swift
- 17. Come creare il proprio driver di stampa XP
- 18. È possibile creare il metodo di estensione del costruttore? Come?
- 19. C# 4.0: Parametri dei parametri come valori predefiniti come array
- 20. Come posso creare una funzione con un gestore di completamento in Swift?
- 21. utilizzo corretto dei riferimenti rvalue come parametri
- 22. Valori dei parametri del metodo Java in ASM
- 23. Validazione dei parametri del metodo con JSR-303
- 24. Come creare il proprio CDN è solo creando un sottodominio?
- 25. Come creare un servizio Windows con parametri?
- 26. E 'possibile creare il proprio locale personalizzata
- 27. Passaggio di tipo anonimo come parametri del metodo
- 28. Come posso creare il caching della firma del metodo?
- 29. metodo come enumerare passati parametri
- 30. TagHelper per il passaggio dei valori del percorso come parte di un collegamento
Assicurarsi di utilizzare '_block = [copia handler];' '... – bbum
copy' è necessario in modo che il blocco viene copiato nell'heap (quello predefinito dal client che richiama il tuo codice viene archiviato nello stack per impostazione predefinita). – yonel