Swift闭包 对比 OC block回调异步加载

1. 空传参数,无返回值

    //block /闭包的应用场景
    //通常用在异步加载网络数据,完成回调
    func loadData(finished: @escaping () -> ()){
        
        //以不能使用
        //dispatch_async(dispatch_get_global_queue(0, 0)) {
        //}
        DispatchQueue.global().async {
            print("耗时操作 \(Thread.current)")
         
            //通常加载数据...
            //异步完成之后,通过 block 回调
            DispatchQueue.main.async {
                print("完成 \(Thread.current)")
                //执行 finished 回调
                finished()
            }
        }
    }

    //调用方法
    loadData {
            print("回调执行代码")
        }

2. 无传惨,有返回值

    //block /闭包的应用场景
    //通常用在异步加载网络数据,完成回调 -> 以 参数 的形式 传递网络获取的数据
    func loadData2(finished: @escaping (_ html:String) -> ()){
        
        //以不能使用
        //dispatch_async(dispatch_get_global_queue(0, 0)) {
        //}
        DispatchQueue.global().async {
            print("耗时操作 \(Thread.current)")
            
            //通常加载数据...
            //异步完成之后,通过 block 回调
            DispatchQueue.main.async {
                print("完成 \(Thread.current)")
                //执行 finished 回调
                finished("<html><html>")
            }
        }
    }

   //调用方法
   loadData2 { html in
            print("完成回调 \(html)")
        }

3. OC 中block使用,无传参,有返回值

//实现方法
-(void)loadData:(void(^)(NSString *html)) finished{
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"耗时操作 %@",NSThread.currentThread);

        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"主线程完成 %@", NSThread.currentThread);
            //执行回调
            finished(@"<html></html");
        });
    });
}

//调用方法
[self loadData:^(NSString *html) {
        NSLog(@"回调执行 %@",html);
    }];

4. ‘尾’随闭包

    //1.闭包参数是函数的最后一个参数 -> 末尾
    //2.函数的 )结束,可以省略
    //3.简化闭包,如果没有参数,没有返回值,可以省略
    func loadData3(){
        DispatchQueue.global().async {
            print("One \(Thread.current)")
            DispatchQueue.main.async {
                print("One 主线程")
            }
        }
        
        DispatchQueue.global().async(execute: {() -> Void in
            print("Two  \(Thread.current)")
            DispatchQueue.main.async(execute: {() -> Void in
                print("Two 主线程")
            })
        })
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Swift 中,闭包是一种自包含的函数代码块,可以在代码中被传递和使用。闭包有能力捕获和存储其所在上下文中任意常量和变量的引用。当闭包中引用了外部的对象时,为了避免循环引用(strong reference cycle),我们需要使用弱引用(weak reference)。 在闭包中使用弱引用可以防止闭包持有外部对象的强引用,从而避免循环引用的问题。循环引用指的是两个或多个对象之间相互持有对方的强引用,导致它们无法被释放,造成内存泄漏。 在 Swift 中,我们可以使用 `[weak self]` 或者 `[unowned self]` 语法来声明一个对外部对象的弱引用。`[weak self]` 会将对外部对象的引用标记为弱引用,而 `[unowned self]` 则标记为无主引用。 下面是一个使用弱引用的闭包示例: ```swift class SomeClass { var completionHandler: (() -> Void)? func doSomething() { completionHandler = { [weak self] in // 使用 weak self 避免循环引用 guard let self = self else { return } // 在闭包中使用 self print("Doing something in \(self)") } completionHandler?() } } let instance = SomeClass() instance.doSomething() ``` 在上面的示例中,我们使用了 `[weak self]` 来声明对外部对象的弱引用。在闭包中,我们使用了 `guard let self = self else { return }` 来确保在闭包执行时,外部对象仍然存在。这样可以避免在闭包中使用已经被释放的对象。 需要注意的是,使用弱引用可能会导致外部对象在闭包执行期间被释放,因此在闭包中使用弱引用的对象时,需要进行额外的判断以确保其存在。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hanyang Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值