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  


  • 相关阅读:
    VS2008编写MFC程序--使用opencv2.4()
    November 02nd, 2017 Week 44th Thursday
    November 01st, 2017 Week 44th Wednesday
    October 31st, 2017 Week 44th Tuesday
    October 30th, 2017 Week 44th Monday
    October 29th, 2017 Week 44th Sunday
    October 28th, 2017 Week 43rd Saturday
    October 27th, 2017 Week 43rd Friday
    October 26th, 2017 Week 43rd Thursday
    October 25th, 2017 Week 43rd Wednesday
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6869242.html
Copyright © 2011-2022 走看看