美文网首页
baidu 到的: block 与 NSArray的enumer

baidu 到的: block 与 NSArray的enumer

作者: FlyTheKite | 来源:发表于2016-12-04 22:40 被阅读84次

    objective-c中NSArray的enumerateObjectsUsingBlock方法是如何实现的
    在调用方法时提供代码块
    ^(id obj, NSUInteger idx, BOOL *stop) {}
    在代码块中可以读到array中的信息,代码块中的参数是如何传进去的?
    谢谢。

    

    当你声明一个方法需要一个块作为参数的话,在生命函数时就要指定块的返回值、参数、并且给块指定一个参数名称,例:

    • (void)HttpPostRequestStr:(NSString *)parameters

                   reqType:(int)req_type
      
                isPersonal:(BOOL)isPersonal
      
                   success:(void (^)(NSDictionary *responseDic))success
      
                   failure:(void (^)(NSError *error))failure
      

    这个方法中我就指定了一个网络请求成功的回调块以及一个网络请求失败的回调块
    他们都是无返回类型,一个需要NSDictionary类型的,另外一个需要一个NSError类型的参数,块的名称分别为success与failure

    而我在方法内调用他们的就很简单了
    只需要打出块名称跟括号,并在括号内给入相应的参数,跟C/C++之中调用函数的写法非常像,如下:
    NSDictionary *tmp_dic = [[NSDictionary alloc] init];
    success(tmp_dic);
    追问
    可能是我问题描述不够清楚,我想问的其实是,例如一个NSArray的实例变量调用
    enumerateObjectsUsingBlock:这个方法的时候,在代码块中obj、idx都是可以直接读取而不用自己去传参的,这个是如何做到的呢?
    追答
    因为参数是在enumerateObjectsUsingBlock方法中调用你的块并传入的啊,要求你传入块参数的目的通常就是回调或完成类似委托的行为,让你在方法执行到某个步骤或结束时可以进行异步处理操作,在封装enumerateObjectsUsingBlock时你的传入的块所需要什么参数就已经被指定了,因为方法的封装者会提供或者说只能提供给你规定好的参数,也就是说你只要将,已经指定好参数的块,按照方法的参数要求,传入方法中,方法就会调用你的块并将参数传入

    或许你是没理解块的执行时机?你传入的块并不是顺序执行下去的,而是方法的分装者在特定情况下调用你的块时你的块才会执行,并且这是异步执行,你调用方法的代码在你将块传入后就已经结束,这时你的块并没有执行

    相关文章

      网友评论

          本文标题:baidu 到的: block 与 NSArray的enumer

          本文链接:https://www.haomeiwen.com/subject/hqqkmttx.html