iOS-Block總結 && 全面解析逆向傳值

一、block的特色:
     block是C語言;
     block是一種數據類型、能夠當作參數,也能夠用作返回值;——總之,對比int的用法用便可(固然,定義的時候,最好跟函數對比);
     block是預先準備好的代碼塊、在須要的時候調用,(須要好好理解「須要時」);
 
二、定義block
     有返回值、有參數:返回類型 ^(blockName)(參數) =  ^返回類型(參數列表){///代碼 };
     無返回值、有參數:void ^(blockName)(參數) = ^(參數列表){///代碼 };
     無返回值、無參數:  void (^blockName)() = ^ { /// 代碼實現; }; 
     上面這麼多,也記不住:
     速記代碼快:inlineBlock ,編譯器會提示:(根據須要刪減就行了);
 

三、block引用外部變量
      在定義block時,若是使用了外部變量,block內部會默認對外部變量作一次copy;
       默認狀況下,不容許在block內部修改外部變量的值;
      在外部變量聲明時,使用__block修飾符,則能夠在block內部修改外部變量的值;
 
四、  數組的遍歷&排序;
      遍歷: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:
五、block的數據的逆向傳值
    
     被調用方:
               準備塊代碼;
               
     調用方:
                 定義塊代碼屬性,在適當的時候調用block;
     
     舉例:(如下三個舉例實現了自定義NSOperation,異步下載一張圖片,並在主線程中顯示)
          調用方:
                       定義塊代碼屬性
[objc]  view plain copy
  1. #import <Foundation/Foundation.h>  
  2.   #import <UIKit/UIKit.h>  
  3.   
  4.   @class YSCNSOperationOP;  
  5.   
  6.   typedef void(^setUpUIImage)(YSCNSOperationOP *);  
  7.   
  8.   @interface YSCNSOperationOP : NSOperation  
  9.   
  10.   @property (nonatomic, copy) NSString *urlString;  
  11.   @property (nonatomic, strong) UIImage *image;  
  12.   
  13.   @property (nonatomic, copy) setUpUIImage myBlock;  
  14.   - (void)setUpUIImage:(setUpUIImage )block;  
  15.   
  16.   @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.   
  14.        NSURL *url = [NSURL URLWithString:urlString];  
  15.        NSData *data = [NSData dataWithContentsOfURL:url];  
  16.        UIImage *image = [UIImage imageWithData:data];  
  17.        return image;  
  18.    }  
  19.    - (void)setUpUIImage:(setUpUIImage )block {  
  20.        if (block) {  
  21.            self.myBlock = block;  
  22.        }  
  23.    }  
  24.    @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、代理:
                    代理方:
                                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  

        2、通知:
                    通知方:註冊通知;
                    觀察者:註冊觀察者;
                                   移除觀察者對象;
               
                     舉例:
                    通知方註冊通知、並在恰當的時候發出通知:
[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.   
  14.     NSURL *url = [NSURL URLWithString:urlString];  
  15.     NSData *data = [NSData dataWithContentsOfURL:url];  
  16.     UIImage *image = [UIImage imageWithData:data];  
  17.     return image;  
  18. }  
  19. @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 
相關文章
相關標籤/搜索