美文网首页
swift 闭包(类似OC中block)

swift 闭包(类似OC中block)

作者: 黑色桃芯 | 来源:发表于2016-09-25 17:14 被阅读154次

swift中的闭包

类似OC中block

  • OC中block 回顾
    创建个HttpTool类
    .h
@interface HttpTool : NSObject

// void(返回值)(^代表block)(参数)
- (void)loadData:(void(^)(NSString *jsonData))callBack;

@end

.m

#import "HttpTool.h"

@implementation HttpTool

- (void)loadData:(void (^)(NSString *))callBack
{
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"发送网络请求:%@", [NSThread currentThread]);
        
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"拿到数据,并且进行回调:%@", [NSThread currentThread]);
            
            //调用block
            callBack(@"json数据");
        });
    });
}

@end

控制器中

#import "ViewController.h"
#import "HttpTool.h"

@interface ViewController ()

/** 注释 */
@property (nonatomic, strong) HttpTool *tools;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.tools = [[HttpTool alloc] init];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//self.tools 调用 loadData:方法 
//loadData:方法中调用block,并传入NSString参数
//下面的jsonData 即为block回调的NSString参数

    [self.tools loadData:^(NSString *jsonData) {
        NSLog(@"在ViewController拿到数据:%@", jsonData);
    }];
}
  • swift中的闭包
  • 闭包的类型
() -> ()
闭包的类型: (参数列表) -> (返回值类型)

创建个HttpTool类

import UIKit

class HttpTool: NSObject {
    // 闭包的类型: (参数列表) -> (返回值类型)
    func loadData(callBack : (jsonData : String) -> ()) {

        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            print("发送网络请求:\(NSThread.currentThread())")
            
            dispatch_sync(dispatch_get_main_queue(), { () -> Void in
                print("获取到数据,并且进行回调:\(NSThread.currentThread())")
                
                callBack(jsonData: "jsonData数据")
            })
        }
    }
}

控制器中

import UIKit

class ViewController: UIViewController {
    
//这里的 HttpTool 不需要导入,swift特性
    var tools : HttpTool = HttpTool()
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        tools.loadData { (jsonData) -> () in

            print("在ViewController拿到数据:\(jsonData)")
          
        }
    }
}
  • 闭包中的循环引用解决
    还是上面的例子,针对闭包中的使用 self 造成循环引用的解决
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        /*
        解决方法一:
        类似oc中 __weak typeof(self) weakself = self 写法
        weakself?.view
        如果前面的可选类型,没有值,后面所有的代码都不会执行
        如果前面的可选类型,有值,系统会自动将weakself进行解包,并且使用weakself
        */
        weak var weakself = self
        tools.loadData { (jsonData) -> () in
            // print("在ViewController拿到数据:\(jsonData)")
            weakself?.view.backgroundColor = UIColor.redColor()
        }

       /*
       解决方法二: 推荐使用该方式
       swift 特有写法,在参数jsonData前面加上 [weak self]
       注意使用也是self? 可选类型,系统自动解包
      */
        tools.loadData {[weak self] (jsonData) -> () in
            // print("在ViewController拿到数据:\(jsonData)")
            self?.view.backgroundColor = UIColor.redColor()
        }
    }
  • swift 中的 dellloc
// deinit相当OC中的dealloc方法,当对象销毁时会调用该函数
    deinit {
        print("ViewController -- deinit")
    }

相关文章

  • 托XX福写个Swift闭包教程

    闭包基础知识 Swift闭包和OC的block类似不过还是有点区别 OC的block是一个匿名函数 Swift 中...

  • Swift之闭包

    前言 闭包类似于OC的block,但是比OC的block应用面更广 在OC中block是匿名函数 在swift中函...

  • iOS&Swift&OC 闭包和Block的相互转化

    一、Swift的闭包 -> OC的block 二、OC的block -> Swift的闭包

  • swift 闭包(类似OC中block)

    swift中的闭包 类似OC中block OC中block 回顾创建个HttpTool类.h .m 控制器中 sw...

  • Swift - 函数,闭包,解除闭包循环引用

    摘要:闭包类似于 OC 的bock,但是比OC的block应用更广;在OC 中block是匿名的函数;在swift...

  • Swift总结

    1.闭包 swift中的闭包类似于oc中的block回调,但是swift的闭包有很多种写法,具有多变性,今天就来总...

  • Swift 之闭包

    闭包 闭包类似于 OC 的 block,但是比 OC 的 block 应用面更广 在 OC 中 block 是匿名...

  • Swift 入门技术 - 闭包

    swift 中的闭包类似于 OC 中的 Block,但是使用比 Block 更广泛 闭包的简单说明 保存提前准备好...

  • Swift-闭包

    Swift 闭包 函数 ()->() Swift 中的闭包和 Objective-C 中的 block 类似,闭包...

  • iOS block和闭包

    OC中称Block swift中称闭包 其实是同一种东西 block是OC中对闭包的实现. 什么是block或者闭...

网友评论

      本文标题:swift 闭包(类似OC中block)

      本文链接:https://www.haomeiwen.com/subject/ygyfyttx.html