闭包
- OC中的block是匿名的函数
- Swift中的闭包是一个特殊的函数
- block和闭包都经常用于回调
OC的block用法回顾
#import "ViewController.h"
#import "HttpTools.h"
@interface ViewController ()
@property (nonatomic, strong) HttpTools *tools;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.tools = [[HttpTools alloc]init];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
__weak ViewController *weakSelf = self;
[self.tools loadData:^(NSString * jsonData) {
NSLog(@"在控制器中,拿到数据:%@", jsonData);
weakSelf.view.backgroundColor = [UIColor redColor];
}];
}
- (void)dealloc {
NSLog(@"ViewController --- dealloc");
}
@end
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface HttpTools : NSObject
- (void)loadData:(void(^)(NSString *))finishedCallback;
@end
NS_ASSUME_NONNULL_END
#import "HttpTools.h"
@interface HttpTools()
@property(nonatomic, copy) void (^finishedCallback)(NSString *);
@end
@implementation HttpTools
- (void)loadData:(void (^)(NSString * _Nonnull))finishedCallback{
self.finishedCallback = finishedCallback;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"已经发送了网络请求:%@", [NSThread currentThread]);
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"回到主线程:%@", [NSThread currentThread]);
finishedCallback(@"json数据");
});
});
}
@end
闭包的使用
import UIKit
class HttpTools {
var finishedCallback : ((_ jsonData : String) -> ())?
func loadData(_ finishedCallback : @escaping (_ jsonData : String) -> ()) {
self.finishedCallback = finishedCallback
DispatchQueue.global().async {
print("发送异步网络请求:\(Thread.current)")
DispatchQueue.main.async {
print("回到主线程:\(Thread.current)")
finishedCallback("json数据")
}
}
}
}
import UIKit
class ViewController: UIViewController {
var httpTools : HttpTools?
override func viewDidLoad() {
super.viewDidLoad()
httpTools = HttpTools()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
httpTools?.loadData({[weak self] (jsonData : String) in
print("在ViewController获取到数据:\(jsonData)")
self?.view.backgroundColor = UIColor.red
})
httpTools?.loadData(){[unowned self] (jsonData : String) in
print("在ViewController获取到数据:\(jsonData)")
self.view.backgroundColor = UIColor.red
}
}
deinit {
print("ViewController ---- deinit")
}
}
懒加载
import UIKit
class ViewController: UIViewController {
lazy var names : [String] = {
let names = ["aaa", "bbb", "ccc"]
print("懒加载了...")
return names
}()
lazy var btn : UIButton = {
let btn = UIButton()
btn.setTitle("按钮", for: .normal)
btn.setImage(UIImage(named: ""), for: .normal)
return btn
}()
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print(names.count)
}
}
访问权限
注释