代理通知Block傳值

三種在類之間傳值得方式 (案例傳圖片)

1.代理

  • 第一步 在委托者(數(shù)據(jù)的傳遞著)的.h文件中,設(shè)置代理協(xié)議和協(xié)議方法
@protocol DownloadOperationDelegate <NSObject>
//傳遞圖片
- (void)transformImage:(UIImage *)image;
@end
  • 并設(shè)置代理協(xié)議屬性
//定義代理協(xié)議
@property (nonatomic, weak) id <DownloadOperationDelegate> delegate;
  • 第二步 在委托者.m文件中通知代理干活
 // 圖片下載完成,把圖片傳遞到控制器
    if ([self.delegate respondsToSelector:@selector(transformImage:)]) {
        [self.delegate transformImage:image];
    }
  • 第三步在代理者(數(shù)據(jù)接收者)的.m文件中,遵守協(xié)議,設(shè)置代理。
//遵守協(xié)議
@interface ViewController ()<DownloadOperationDelegate>
 // 設(shè)置操作op的代理是Vc
    op.delegate = self;
  • 實(shí)現(xiàn)代理方法,在代理方法傳過來的參數(shù)里有數(shù)據(jù),接收之。
- (void)transformImage:(UIImage *)image{
    self.imgV.image = image;
    NSLog(@"圖片下載完成,傳遞過來了,%@",image);
    
}

2.通知

  • 第一步 在數(shù)據(jù)傳遞者的.m文件中發(fā)布通知,傳遞數(shù)據(jù)
//圖片下載完成,把圖片傳遞到控制器
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DownloadImageFinishedNotification" object:image];
  • 第二步,在數(shù)據(jù)接收者的.m文件中,添加通知監(jiān)聽者,監(jiān)聽通知,接收數(shù)據(jù)。并且在dealloc方法中注銷通知監(jiān)聽者
//注冊(cè)通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(transformImage:) name:@"DownloadImageFinishedNotification" object:nil];
- (void)dealloc
{
    // 注銷通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
  • 第三步,實(shí)現(xiàn)注冊(cè)通知里,接收到了通知會(huì)調(diào)用的方法。(方法里有參數(shù),就是數(shù)據(jù))
- (void)transformImage:(NSNotification *)notification{
    NSLog(@"%@",notification.object);
    self.imgV.image = notification.object;
    
}

3.Block

  • 第一步設(shè)置數(shù)據(jù)傳遞者的Block屬性

    //定義傳圖片的Block屬性
    

@property (nonatomic, copy) void(^finishedBlock)(UIImage *image);
```

  • 第二步重寫main,在操作執(zhí)行之前攔截并給Block傳遞參數(shù)(就是要傳遞的圖片)
 //操作要執(zhí)行前,先判斷Block有值才執(zhí)行這段代碼,調(diào)用VC傳進(jìn)來的Block (回調(diào))傳值。
    if (self.finishedBlock) {
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            self.finishedBlock(image);
            NSLog(@"傳遞圖片%@",image);
        }];
    }
  • 第三步 給op的屬性finishedBlock賦值,可以獲取其傳入的圖片
 //給op的屬性finishedBlock賦值,可以獲取其傳入的圖片
    op.finishedBlock = ^(UIImage *image){
        //給當(dāng)前控制器的imgV加載圖片
        self.imgV.image = image;
        //
        NSLog(@"獲取圖片%@---%@",image,[NSThread currentThread]);
        
    };

需要注意的是 :

//將操作添加到當(dāng)前隊(duì)列中 (執(zhí)行這代碼之后,在DownloadOperation.m文件中,重寫了main方法,這時(shí)在cpu調(diào)度操作之前,傳入了圖片。所以是先打印獲取圖片,再打印傳遞圖片)
    [self.queue addOperation:op];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 實(shí)際開發(fā)中,幾乎到處都會(huì)有用到傳值,而傳值分為正向傳值以及逆(反)向傳值,比如從界面一調(diào)到界面二,并將值從界面一傳...
    不走尋常way閱讀 877評(píng)論 0 6
  • 最近也不知道寫什么好,因?yàn)榭臻e下來就想寫點(diǎn)東西,以前寫代碼沒有注意到代理和block的規(guī)范,最好是帶上當(dāng)前類,為了...
    凡塵一笑閱讀 781評(píng)論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,586評(píng)論 19 139
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,626評(píng)論 30 472
  • 有的時(shí)候,我們需要頁面跳轉(zhuǎn)傳遞數(shù)據(jù),就需要將這個(gè)頁面通過某種形式傳遞給另一個(gè)頁面。我們把兩個(gè)頁面分別記做:傳值頁面...
    iOS學(xué)末閱讀 1,100評(píng)論 0 11

友情鏈接更多精彩內(nèi)容