Swift 自定义异步回调 block

4,140 阅读2分钟

1.定义异步返回类型

新建一个返回类型成功or失败的枚举
请求成功返回自定义描述[successStr],请求失败则返回自定义描述[errorStr]

enum createResult {
    case success(successStr:String)
    case error(errorStr:String)
}

2.请求方法

.success 是createResult的定义的成功回调的类型
.error 是createResult的定义的成功回调的类型

//请求成功返回自定义描述[successStr],请求失败则返回自定义描述[errorStr]

func create(name:String,completionHandler: @escaping(createResult) -> Void ) {
    DispatchQueue.global().async {
        //模拟Http线程内请求  阻塞3秒
        sleep(3)
        //模拟返回成功回调
        completionHandler(.success(successStr: "请求成功 name = \(name)"))
        
        //模拟返回失败回调
        completionHandler(.error(errorStr: "请求失败 name = \(name)"))
    }
}

3.外部调用方法

外部调用模拟请求的方法并接收成功与失败的情况

//执行create添加方法
create(name: "xinG") { result in
    switch result{
    case .error(let errorStr):
        print("Error:\(errorStr)")
        break;
    case .success(let successStr):
    
        print("Success:操作成功)")
        print("Success:\(successStr)")

        break
    }
}

总结

这样的处理能给外部使用的block,通过枚举的形式,能告诉调用对象内部处理的状态,语义也十分清晰。

完整的代码片段

enum NetworkError: Error {
    case badURL
}

//请求成功返回自定义描述[successStr],请求失败则返回自定义描述[errorStr]
   enum createResult {
    case success(successStr:String)
    case error(errorStr:String)
}

//请求成功返回自定义描述[successStr],请求失败则返回自定义描述[errorStr]
func create(name:String,completionHandler: @escaping(createResult) -> Void ) {
    DispatchQueue.global().async {
        //模拟Http线程内请求  阻塞3秒
        sleep(3)
        //模拟返回成功回调
        completionHandler(.success(successStr: "请求成功 name = \(name)"))
        
        //模拟返回失败回调
        completionHandler(.error(errorStr: "请求失败 name = \(name)"))
    }
}

//外部调用模拟请求的方法并接收成功与失败的情况
create(name: "xinG") { result in
    switch result{
    
    case .error(let errorStr):
        print("Error:\(errorStr)")
        break;
        
    case .success(let successStr):
        print("Success:操作成功)")
        print("Success:\(successStr)")
        break
    }
    
}
print("==end")
sleep(1000)