您的位置:首页 > 移动开发 > IOS开发

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

2015-12-06 22:59 1881 查看
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,异步下载一张图片,并在主线程中显示)

          调用方:
                       定义块代码属性
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@class YSCNSOperationOP;

typedef void(^setUpUIImage)(YSCNSOperationOP *);

@interface YSCNSOperationOP : NSOperation

@property (nonatomic, copy) NSString *urlString;
@property (nonatomic, strong) UIImage *image;

@property (nonatomic, copy) setUpUIImage myBlock;
- (void)setUpUIImage:(setUpUIImage )block;

@end

在适当的时候执行:   

#import "YSCNSOperationOP.h"
@implementation YSCNSOperationOP
- (void)main {
@autoreleasepool {
UIImage *image  = [self downLoadImage:self.urlString];
self.image = image;
dispatch_async(dispatch_get_main_queue(), ^{
self.myBlock(self);
});
}
}
- (UIImage *)downLoadImage:(NSString *)urlString{

NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
return image;
}
- (void)setUpUIImage:(setUpUIImage )block {
if (block) {
self.myBlock = block;
}
}
@end


     被调用方:
                         准备代码块:
 
#import "ViewController.h"
#import "YSCNSOperationOP.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
YSCNSOperationOP *yscOp = [[YSCNSOperationOP alloc] init];
yscOp.urlString = @"http://h.hiphotos.baidu.com/image/pic/item/9825bc315c6034a8094ace24c9134954082376ee.jpg";
[yscOp setUpUIImage:^(YSCNSOperationOP *op) {
self.iamgeView.image = op.image ;
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:yscOp];
}
@end


其它方式的逆向传值:

           一、代理:
                    代理方:

                                1)遵守协议;

                                2)设置代理;

                                3)实现代理方法;
                    
                    委托方:

                                1)定义协议;

                                2)代理属性;

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

                     委托方:定义协议;
                                      代理属性;

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class YSCNSOperation;
@protocol YSCNSOperationDelegate <NSObject>
- (void)yscNSOperation:(YSCNSOperation *)operation withImage:(UIImage *)image;
@end
@interface YSCNSOperation : NSOperation
@property (nonatomic, copy) NSString *urlString;
@property (nonatomic, strong) UIImage *image;
@property (nonatomic, weak) id<YSCNSOperationDelegate> delegate;
@end

在需要的时候通知代理:
#import "YSCNSOperation.h"
@implementation YSCNSOperation
- (void)main {
@autoreleasepool {
UIImage *image  = [self downLoadImage:self.urlString];
self.image = image;
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.delegate respondsToSelector:@selector(yscNSOperation:withImage:)]) {
[self.delegate yscNSOperation:self withImage:image];
}
});
}
}
- (UIImage *)downLoadImage:(NSString *)urlString{
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
return image;
}
@end

                         代理方:
#import "ViewController.h"
#import "YSCNSOperation.h"
@interface ViewController () <YSCNSOperationDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
YSCNSOperation *yscOp = [[YSCNSOperation alloc] init];
yscOp.delegate = self;
yscOp.urlString = @"http://h.hiphotos.baidu.com/image/pic/item/9825bc315c6034a8094ace24c9134954082376ee.jpg";
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:yscOp];
});
}
- (void)yscNSOperation:(YSCNSOperation *)operation withImage:(UIImage *)image {
self.iamgeView.image = operation.image;
}
@end

        二、通知:

                    通知方:注册通知;

                    观察者:注册观察者;

                                   移除观察者对象;
               
                     举例:
                    通知方注册通知、并在恰当的时候发出通知:

#import "YSCNSOperation.h"
@implementation YSCNSOperation
- (void)main {
@autoreleasepool {
UIImage *image  = [self downLoadImage:self.urlString];
self.image = image;
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"setUpUI" object:self];
});
}
}
- (UIImage *)downLoadImage:(NSString *)urlString{

NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
return image;
}
@end


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

#import "ViewController.h"
#import "YSCNSOperation.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iamgeView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(lookNotifi:) name:@"setUpUI" object: nil];
}
- (void)lookNotifi:(NSNotification *)notifi{
YSCNSOperation *op= (YSCNSOperation *)notifi.object;
self.iamgeView.image = op.image;
//self.iamgeView.image =  (UIImage *)notifi.object;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
YSCNSOperation *yscOp = [[YSCNSOperation alloc] init];
yscOp.urlString = @"http://h.hiphotos.baidu.com/image/pic/item/9825bc315c6034a8094ace24c9134954082376ee.jpg";
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:yscOp];
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息