iOS-Block总结 && 全面解析逆向传值

1、block的特点:

block是C语言;

block是一种数据类型、可以当做参数,也可以用做返回值;——总之,对比int的用法用即可(当然,定义的时候,最好跟函数对比);

block是预先准备好的代码块、在需要的时候调用,(需要好好理解“需要时”);

2、定义block

有返回值、有参数:返回类型 ^(blockName)(参数) =  ^返回类型(参数列表){///代码 };

无返回值、有参数:void ^(blockName)(参数) = ^(参数列表){///代码 };

无返回值、无参数: void (^blockName)() = ^ { /// 代码实现; };

上面这么多,也记不住:

速记代码快:inlineBlock ,编译器会提示:(根据需要删减就好了);

3、block引用外部变量

在定义block时,如果使用了外部变量,block内部会默认对外部变量做一次copy;

默认情况下,不允许在block内部修改外部变量的值;

在外部变量声明时,使用__block修饰符,则可以在block内部修改外部变量的值;

4、 数组的遍历&排序;

遍历:enumerateObjectsUsingBlock:

所有的参数都已经准备到位,可以直接使用

效率比for高,官方推荐使用;

举例:懒加载

enumerateObjectsUsingBlock遍历:

[tempArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL*_Nonnull stop) {

NSDictionary *dict = (NSDictionary*)obj;
            Heros *hero = [HerosherosWithDict:dict];

[ArrMaddObject:hero];

}];

for—IN遍历:

for (NSDictionary*dict in tempArray) {
            Heros *heros = [HerosherosWithDict:dict];
            [ArrM addObject:heros];

}

排序:sortedArrayUsingComparator:

5、block的数据的逆向传值

被调用方:

准备块代码;

调用方:

定义块代码属性,在适当的时候调用block;

举例:(以下三个举例实现了自定义NSOperation,异步下载一张图片,并在主线程中显示)

调用方:

定义块代码属性

[objc] view plain copy

  1. #import <Foundation/Foundation.h>
  2. #import <UIKit/UIKit.h>
  3. @class YSCNSOperationOP;
  4. typedef void(^setUpUIImage)(YSCNSOperationOP *);
  5. @interface YSCNSOperationOP : NSOperation
  6. @property (nonatomic, copy) NSString *urlString;
  7. @property (nonatomic, strong) UIImage *image;
  8. @property (nonatomic, copy) setUpUIImage myBlock;
  9. - (void)setUpUIImage:(setUpUIImage )block;
  10. @end

在适当的时候执行:

[objc] view plain copy

  1. #import "YSCNSOperationOP.h"
  2. @implementation YSCNSOperationOP
  3. - (void)main {
  4. @autoreleasepool {
  5. UIImage *image  = [self downLoadImage:self.urlString];
  6. self.image = image;
  7. dispatch_async(dispatch_get_main_queue(), ^{
  8. self.myBlock(self);
  9. });
  10. }
  11. }
  12. - (UIImage *)downLoadImage:(NSString *)urlString{
  13. NSURL *url = [NSURL URLWithString:urlString];
  14. NSData *data = [NSData dataWithContentsOfURL:url];
  15. UIImage *image = [UIImage imageWithData:data];
  16. return image;
  17. }
  18. - (void)setUpUIImage:(setUpUIImage )block {
  19. if (block) {
  20. self.myBlock = block;
  21. }
  22. }
  23. @end

被调用方:

准备代码块:

[objc] view plain copy

  1. #import "ViewController.h"
  2. #import "YSCNSOperationOP.h"
  3. @interface ViewController ()
  4. @property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
  5. @end
  6. @implementation ViewController
  7. - (void)viewDidLoad {
  8. [super viewDidLoad];
  9. // Do any additional setup after loading the view, typically from a nib.
  10. }
  11. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
  12. YSCNSOperationOP *yscOp = [[YSCNSOperationOP alloc] init];
  13. yscOp.urlString = @"http://h.hiphotos.baidu.com/image/pic/item/9825bc315c6034a8094ace24c9134954082376ee.jpg";
  14. [yscOp setUpUIImage:^(YSCNSOperationOP *op) {
  15. self.iamgeView.image = op.image ;
  16. }];
  17. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  18. [queue addOperation:yscOp];
  19. }
  20. @end

其它方式的逆向传值:

一、代理:

代理方:

1)遵守协议;

2)设置代理;

3)实现代理方法;

委托方:

1)定义协议;

2)代理属性;

3)在需要的时候通知代理;‘

举例

委托方:定义协议;

代理属性;

[objc] view plain copy

  1. #import <Foundation/Foundation.h>
  2. #import <UIKit/UIKit.h>
  3. @class YSCNSOperation;
  4. @protocol YSCNSOperationDelegate <NSObject>
  5. - (void)yscNSOperation:(YSCNSOperation *)operation withImage:(UIImage *)image;
  6. @end
  7. @interface YSCNSOperation : NSOperation
  8. @property (nonatomic, copy) NSString *urlString;
  9. @property (nonatomic, strong) UIImage *image;
  10. @property (nonatomic, weak) id<YSCNSOperationDelegate> delegate;
  11. @end

在需要的时候通知代理:

[objc] view plain copy

  1. #import "YSCNSOperation.h"
  2. @implementation YSCNSOperation
  3. - (void)main {
  4. @autoreleasepool {
  5. UIImage *image  = [self downLoadImage:self.urlString];
  6. self.image = image;
  7. dispatch_async(dispatch_get_main_queue(), ^{
  8. if ([self.delegate respondsToSelector:@selector(yscNSOperation:withImage:)]) {
  9. [self.delegate yscNSOperation:self withImage:image];
  10. }
  11. });
  12. }
  13. }
  14. - (UIImage *)downLoadImage:(NSString *)urlString{
  15. NSURL *url = [NSURL URLWithString:urlString];
  16. NSData *data = [NSData dataWithContentsOfURL:url];
  17. UIImage *image = [UIImage imageWithData:data];
  18. return image;
  19. }
  20. @end

代理方:

[objc] view plain copy

  1. #import "ViewController.h"
  2. #import "YSCNSOperation.h"
  3. @interface ViewController () <YSCNSOperationDelegate>
  4. @property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
  5. @end
  6. @implementation ViewController
  7. - (void)viewDidLoad {
  8. [super viewDidLoad];
  9. }
  10. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
  11. static dispatch_once_t onceToken;
  12. dispatch_once(&onceToken, ^{
  13. YSCNSOperation *yscOp = [[YSCNSOperation alloc] init];
  14. yscOp.delegate = self;
  15. yscOp.urlString = @"http://h.hiphotos.baidu.com/image/pic/item/9825bc315c6034a8094ace24c9134954082376ee.jpg";
  16. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  17. [queue addOperation:yscOp];
  18. });
  19. }
  20. - (void)yscNSOperation:(YSCNSOperation *)operation withImage:(UIImage *)image {
  21. self.iamgeView.image = operation.image;
  22. }
  23. @end

二、通知:

通知方:注册通知;

观察者:注册观察者;

移除观察者对象;

举例:

通知方注册通知、并在恰当的时候发出通知:

[objc] view plain copy

  1. #import "YSCNSOperation.h"
  2. @implementation YSCNSOperation
  3. - (void)main {
  4. @autoreleasepool {
  5. UIImage *image  = [self downLoadImage:self.urlString];
  6. self.image = image;
  7. dispatch_async(dispatch_get_main_queue(), ^{
  8. [[NSNotificationCenter defaultCenter] postNotificationName:@"setUpUI" object:self];
  9. });
  10. }
  11. }
  12. - (UIImage *)downLoadImage:(NSString *)urlString{
  13. NSURL *url = [NSURL URLWithString:urlString];
  14. NSData *data = [NSData dataWithContentsOfURL:url];
  15. UIImage *image = [UIImage imageWithData:data];
  16. return image;
  17. }
  18. @end

观察者:注册观察者、移除观察者

[objc] view plain copy

  1. #import "ViewController.h"
  2. #import "YSCNSOperation.h"
  3. @interface ViewController ()
  4. @property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
  5. @end
  6. @implementation ViewController
  7. - (void)viewDidLoad {
  8. [super viewDidLoad];
  9. // Do any additional setup after loading the view, typically from a nib.
  10. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(lookNotifi:) name:@"setUpUI" object: nil nil];
  11. }
  12. - (void)lookNotifi:(NSNotification *)notifi{
  13. YSCNSOperation *op= (YSCNSOperation *)notifi.object;
  14. self.iamgeView.image = op.image;
  15. //self.iamgeView.image =  (UIImage *)notifi.object;
  16. }
  17. - (void)dealloc {
  18. [[NSNotificationCenter defaultCenter] removeObserver:self];
  19. }
  20. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
  21. YSCNSOperation *yscOp = [[YSCNSOperation alloc] init];
  22. yscOp.urlString = @"http://h.hiphotos.baidu.com/image/pic/item/9825bc315c6034a8094ace24c9134954082376ee.jpg";
  23. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  24. [queue addOperation:yscOp];
  25. }
  26. @end
时间: 2024-10-26 06:19:24

iOS-Block总结 && 全面解析逆向传值的相关文章

iOS 代理与block 逆向传值 学习

一般在项目中出现逆向传值的时候就需要用到代理.block 或者通知中心了.由于公司的项目底层封装的很好,所以项目做了三四个月就算碰到需要逆传的情况也不用自己处理.但是最近遇到了一个特别的情况就需要自己处理一下了,之前也在网上看了一下关于如何选择代理.block 或者通知中心.个人感觉代理和通知中心都比较简单,block稍为有点复杂.代理大家都会用,所以当时就选用了通知中心来处理.之后有一次公司的网实在太差了,出现了逆传数据失败的情况,引起了我的注意,打上断点之后才发现,通知中心的那个方法完全没有

iOS Block界面反向传值

在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性.用维基百科的话来说,Block是Apple Inc.为C.C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包.关于闭包,一句话解释简洁明了:闭包就是能够读取其它函数内部变量的函数. 在iOS开发中,Block有很多方面的用途,

iOS block从零开始

iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void (^myBlock)(int a) = ^(int a){ NSLog(@"%zd",a); }; NSLog(@"旭宝爱吃鱼"); myBlock(999); 输出结果: 2016-05-03 11:27:18.571 block[5340:706252] 旭宝爱吃鱼

ios Block学习

ios block 回调传值,回调事件, 直接上代码 在firstVC里面的tableView 点击方法 ,里面点击跳到另一个nextVC,然后返回后的firstVC后回调值 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NextViewController *next=[[NextViewController alloc]init]; __block Nex

IOS block 教程&lt;转&gt;

http://pernghh.pixnet.net/blog/trackback/eac87d412e/33563409 本文来自台湾的某开发人员的博客,被墙,感觉讲的比较易懂,所以引过来.文字简体化了,原来是繁体,变数=变量,这个注意一下. 本章学习目标: 1. 了解何谓block. 2. 了解block的使用方法. Block 是iOS在4.0之后新增的程式语法,严格来说block的概念并不算是基础程式设计的范围,对初学者来说也不是很容易了解,但是在iOS SDK 4.0之后,block几乎

ios 自带xml 解析,TBXMLParser解析

今天看了下苹果xml 解析,写了个小demo 心想还是 在博客上写点东西吧,毕竟很久很久都没有上来了 先上个效果图把 接下来 看下 工程目录图吧 本demo 分两种解析模式,一是苹果自带的, 首先先看下苹果自带的吧,工程文件为 NoteXMLParser 文件 ,另一种解析模式 是 NotesTBXMLParser文件 NoteXMLParser.h 文件代码如下 : // // NoteXMLParser.h // TestXML // // Created by choni on 14-5-

写给喜欢用Block的朋友(ios Block)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/38090205 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! 本文不讲block如何声明及使用,只讲block在使用过程中暂时遇到及带来的隐性危险. 主要基于两点进行演示: 1.block 的循环引用(retain cycle) 2.去除block产生的告警时,需注意问题. 有一次,朋友问我当一个对象中的b

iOS开发之XML解析

iOS开发之XML解析 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示XML文件版本, 内部文本使用的编码 <root> 表示根节点 <CityName>北京</CityName>  一个结点, CityName是结点名, 北京结点值 <Item key="1" value="A"></Item>  

iOS block并发

iOS block并发 2012-06-13 09:31 1351人阅读 评论(0) 收藏 举报 iosuiviewnetwork任务threadimage 这篇文章转自 http://anxonli.iteye.com/blog/1097777,集中与iOS的多核编程和内存管理,大家完全可以使用苹果的多核编程框架来写出更加responsive的应用. 多核运算 在iOS中concurrency编程的框架就是GCD(Grand Central Dispatch), GCD的使用非常简单.它把任务