Swift Language
Controlador de finalización
Buscar..
Introducción
Prácticamente todas las aplicaciones utilizan funciones asíncronas para evitar que el código bloquee el subproceso principal.
Controlador de finalización sin argumento de entrada
func sampleWithCompletion(completion:@escaping (()-> ())){
let delayInSeconds = 1.0
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {
completion()
}
}
//Call the function
sampleWithCompletion {
print("after one second")
}
Controlador de finalización con argumento de entrada
enum ReadResult{
case Successful
case Failed
case Pending
}
struct OutpuData {
var data = Data()
var result: ReadResult
var error: Error?
}
func readData(from url: String, completion: @escaping (OutpuData) -> Void) {
var _data = OutpuData(data: Data(), result: .Pending, error: nil)
DispatchQueue.global().async {
let url=URL(string: url)
do {
let rawData = try Data(contentsOf: url!)
_data.result = .Successful
_data.data = rawData
completion(_data)
}
catch let error {
_data.result = .Failed
_data.error = error
completion(_data)
}
}
}
readData(from: "https://raw.githubusercontent.com/trev/bearcal/master/sample-data-large.json") { (output) in
switch output.result {
case .Successful:
break
case .Failed:
break
case .Pending:
break
}
}
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow