文档章节

iOS中perform+@selector多参数传递

IamOkay
 IamOkay
发布于 2016/03/20 19:28
字数 566
阅读 2229
收藏 3

iOS中performSelector实现多参数传递


关于performSelector实现多个参数传递,其实有2种方案,第一种是使用 NSInvocation,第二种是封装参数。按照参数传递的原则,例如c++中的线程,我们只能传递一个参数,但我们可以将参数封装进结构体或者class也是一种优秀的方案。


两种方法的比较,第一种使用了Runtime反射机制,效率又说折扣,可读性也不好好,第二种方法,效率较高,可读性也比较好。所以对比而言,推荐第二种将参数封装进结构体或者对象,作为DTO的作用。


第一种方法NSInvocation
- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects
{
    // 方法签名(方法的描述)
    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];
    if (signature == nil) {
      
        //可以抛出异常也可以不操作。
    }
    
    // NSInvocation : 利用一个NSInvocation对象包装一次方法调用(方法调用者、方法名、方法参数、方法返回值)
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self;
    invocation.selector = selector;
    
    // 设置参数
    NSInteger paramsCount = signature.numberOfArguments - 2; // 除self、_cmd以外的参数个数
    paramsCount = min(paramsCount, objects.count);
    for (NSInteger i = 0; i < paramsCount; i++) {
        id object = objects[i];
        if ([object isKindOfClass:[NSNull class]]) continue;
        [invocation setArgument:&object atIndex:i + 2];
    }
    
    // 调用方法
    [invocation invoke];
    
    // 获取返回值
    id returnValue = nil;
    if (signature.methodReturnLength) { // 有返回值类型,才去获得返回值
        [invocation getReturnValue:&returnValue];
    }
    
    return returnValue;
}

当然,为了保证线程意义,我们可以如下

- (void) performSelectorOnMainThread:(SEL)selector withObject:(id)arg1 withObject:(id)arg2 waitUntilDone:(BOOL)wait{

NSMethodSignature *sig = [self methodSignatureForSelector:selector];
if (!sig)
 return;
NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];

[invo setTarget:self];
[invo setSelector:selector];
[invo setArgument:&arg1 atIndex:2];
[invo setArgument:&arg2 atIndex:3];
[invo retainArguments];

[invo performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:wait];

}


第二种方法[参数封装](推荐)

我们还可以将参数进行封装成一个结构体,Class,或者是字典和其他集合,然后定义一个单参数的方法也是可取的,这里就不给出例子了

-(void)askWorker:(NSString *) name withID:(NSInteger) money AtDate:(NSDate *)date
{
  
    NSLog(@"%@---@ld---%@",name,(long)money,date);
}
-(void) askWorker:(NSObject *)args
{
    
    if([args isKindOfClass:[NSDictonary class]]
    {
       NSDictionary * dict = (NSDictionary *)args;
      [self askWorker:dict[@"name"] withID:(NSInteger)dict[@"ID"] AtDate:dict[@"date"]];
    }else if([args isKindOfClass:[UserProfile class]]){
       UserProfile * profile = (UserProfile *)args;
       [self askWorker:profile.name withID:profile.ID AtDate:profile.date];
    }
}

调用如下

   NSDictionary * dict = @{@"name":@"zhangsan",@"ID":@20102847,@"date":[NSDate dateWithTimeIntervalSince1970:0]};
   [[TestDict share] performSelector:@selector(askWorker:) withObject:dict];



© 著作权归作者所有

共有 人打赏支持
IamOkay
粉丝 187
博文 459
码字总数 372015
作品 0
海淀
程序员
iOS与JS交互之WKWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
09/01
0
0
iOS与JS交互之UIWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「UIWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
08/28
0
0
iOS与JS交互之UIWebView-JavaScriptCore框架

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JavaScriptCore」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前...

QiShare
08/30
0
0
iOS与JS交互之UIWebView-JSExport协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JSExport」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端(不...

QiShare
08/31
0
0
iOS使用Objective-c自定义cordova插件(-)

本系列教程为博主初次使用开发,内容如有差错,欢迎指正,敬请谅解。 博客地址:http://blog.img421.com/iosshi-yong-object-czi-ding-yi-cordovacha-jian/ Mac安装ionic和cordova我们已经熟悉,...

Michaelyn
2017/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spark Load Data and Export Data

Load_Data_Command 一、导入数据-加载csv文件数据作为spark 临时表DataSource(不需要提前创建表,方便数据分析) 该命令将csv文件导入到临时表中,命令格式为 load data '文件路径' table [...

Avner
9分钟前
1
0
CDH5.13离线安装Spark2.3详细步骤

简介: 在我的CDH5.13集群中,默认安装的spark是1.6版本,这里需要将其升级为spark2.x版本。经查阅官方文档,发现spark1.6和2.x是可以并行安装的,也就是说可以不用删除默认的1.6版本,可以直...

hblt-j
13分钟前
1
0
Add XSS protection headers on Nginx

Add XSS protection headers on Nginx Add the following line in the http or server part of your Nginx configuration : ... # XSS Protection add_header X-Frame-Opt......

idoz
13分钟前
1
0
cmake windows 配置xp toolset

MPRO
20分钟前
1
0
day125-20181023-英语流利阅读-待学习

外卖员不要哭,打零工不容易 雪梨 2018-10-23 1.今日导读 上期我们讲到,有人认为:“零工经济”虽然没有占领全世界,但它剥夺了劳动者的合法权利,加剧了工作的不稳定性,那么“零工经济”是...

飞鱼说编程
32分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部