zoukankan      html  css  js  c++  java
  • 【iOS】代理传值与块代码传值

    主线程与子线程常常须要进行数据的传递。不同的类之间,不同的控制器之间都须要。

    并且常常须要监听一个动作的完毕。而后才去做对应事件。

    (代理是一对一的关系)。


    一、代理传值

    代理是一种设计模式。

    iOS中用的许多。能够通过自己定义代理来进行传值。

    參见我的这篇文章 http://blog.csdn.net/xn4545945/article/details/31036523

    在iOS中。托付方与被托付方都要实现3个步骤。(见代码凝视)

    以下代码:模拟下载完毕后须要更新UI. 用代理来传值.


    XNUpload.h

    #import <Foundation/Foundation.h>
    
    //1.定义代理协议
    @protocol XNUploadDelegate <NSObject>
    - (void)downloadFinshed:(NSString *)param;
    @end
    
    
    @interface XNUpload : NSObject
    //2.定义代理属性
    @property (nonatomic, assign) id <XNUploadDelegate> delegate;
    
    -(void)download;
    @end
    

    XNUpload.m

    #import "XNUpload.h"
    
    @implementation XNUpload
    /**
     *  模拟下载完毕后须要更新UI
     */
    - (void)download {
    	NSLog(@"正在下载....");
    	sleep(3.0);
    	NSLog(@"下载完毕!");
    	//3.往主线程中更新UI, 须要传递參数. 通知主线程下载完毕. (调用代理方法)
    	[self.delegate downloadFinshed:@"下载完毕啦!"];
    }
    
    @end

    XNViewController.m

    #import "XNViewController.h"
    #import "XNUpload.h"
    
    @interface XNViewController () <XNUploadDelegate> //1. 遵守代理协议
    
    @end
    
    @implementation XNViewController
    - (void)viewDidLoad {
    	[super viewDidLoad];
    	XNUpload *upload = [[XNUpload alloc] init];
    	[upload download];   //下载了
    
    	//2. 设置代理
    	upload.delegate = self;
    }
    
    //3.实现代理方法. 这种方法里面就表明下载完毕了.
    - (void)downloadFinshed:(NSString *)param {
    	NSLog(@"%@", param);
    }
    
    @end
    

    二、块代码传值

    块代码传值更加简便,且代码更加紧凑。更方便。多线程中用块代码更加普遍。

    使用注意 :
    1.当不设置block传入nil,会报野指针excbadaccess. (解决:推断一下,if(xx){..})
    2.block运行应该回主线程去更新UI,到里面dispatch一下.
    3.苹果建议全部的块代码定义不要放在头文件.(解决:直接在使用块代码的来个匿名的OK)
    *优点:避免自定义的块代码名与苹果内置的冲突重名.

    代码例如以下:
    XNUpload.h
    #import <Foundation/Foundation.h>
    
    
    @interface XNUpload : NSObject
    - (void)download:(void (^)(NSString *param))completion;
    @end

    XNUpload.m

    #import "XNUpload.h"
    
    @implementation XNUpload
    /**
     *  模拟下载完毕后须要更新UI. 使用块代码.
     */
    - (void)download:(void (^)(NSString *param))completion { //1.在參数中定义块代码
    	NSLog(@"正在下载....");
    	sleep(3.0);
    	NSLog(@"下载完毕!");
    	//往主线程中更新UI, 须要传递參数. 通知主线程下载完毕. (使用块代码)
    	if (completion) {
    		//这样能够让调用者不用关心线程问题
    		dispatch_async(dispatch_get_main_queue(), ^{
    		    completion(@"下载完毕!");  //2.运行块代码
    		});
    	}
    }
    
    @end
    

    XNViewController.m

    #import "XNViewController.h"
    #import "XNUpload.h"
    
    @interface XNViewController ()
    
    @end
    
    @implementation XNViewController
    
    - (void)viewDidLoad {
    	[super viewDidLoad];
    	XNUpload *upload = [[XNUpload alloc] init];
    
    	//直接调用方法就可以
    	[upload download: ^(NSString *param) {
    	    NSLog(@"%@", [NSThread currentThread]);
    	    NSLog(@"%@", param);
    	}];
    }
    
    @end
    

    块代码与代理比較。用起来简单非常多,非常方便。


    转载请注明出处:http://blog.csdn.net/xn4545945  


  • 相关阅读:
    24. orcle创建备份表
    23. oralce11g导出dmp然后导入Oracle10g
    模板
    日记集
    Outlook 2013 电子邮件账户设置备份与恢复
    Firefox恢复书签
    Windows 7 Professional安装多语言包
    CentOS下成功修复了Windows的grub引导
    CentOS 7修复MBR和GRUB
    从移动硬盘开机,引导VHD(Win10)
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6869242.html
Copyright © 2011-2022 走看看