谈谈iOS的回调

作者: FighterRay27 | 来源:发表于2015-12-08 01:26 被阅读3888次

    开始之前先讲一个小故事:
    有一天你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。

    在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件

    由此我们就容易理解一些代码中的回调,通俗地来讲就是:

    一般写程序是你调用系统的API,如果把关系反过来,你写一个函数,让系统调用你的函数,那就是回调,那个被系统调用的函数就是回调函数

    好滴~理解了回调的概念,我们就正式进入主题,谈谈iOS中几种常见的回调:

    1.目标-动作对 terget-action

    当特定的事件x发生时,向指定对象发送特定的消息,这里接收消息的对象是目标target,消息的选择器就是动作action
    这种回调是比较常见的,我们使用在Xcode中的IB图形编译器会用到如下的代码。

    - (IBAction)callback:(id)sender {
       //do something you like~
    }
    

    不用IB图形编译器,用代码就是:

    [_shopBtn addTarget:self
                     action:@selector(enterShop)
           forControlEvents:UIControlEventTouchUpInside];
    

    2.委托协议 protocol

    当特定的事件x发生时,像遵守相应协议的辅助对象为发送消息,委托对象delegate和数据源dataSource都是常见的辅助对象。
    这种回调方式最典型的是tableView的协议,内容较多,本文就不再赘述了,可以参见teble

    3.通告 Notification

    运用观察者模式,将自己注册为Observer
    eg:

    - (void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        [[NSNotificationCenter defaultCenter] 
             addObserver:self 
                selector:@selector(outputWithNote:) 
                     name:@"OutputArrayNotification" object:nil];
    }
    
    - (void)viewWillDisappear:(BOOL)animated{
        [[NSNotificationCenter defaultCenter] 
                removeObserver:self 
                          name:@"OutputArrayNotification" 
                         object:nil];
    
    - (IBAction)notificationCallback:(id)sender {
        NSString *s = @"NitificationCallback";
        [[NSNotificationCenter defaultCenter] 
            postNotificationName:@"OutputArrayNotification" 
                          object:s];
    }
    
    - (void)outputWithNote:(NSNotification *)aNotification
    {
        NSString *s = [aNotification object];
        _textLabel.text = s;
    }
    

    4.代码块block

    其实block可以理解成C语言的函数指针。_

    block.png
    eg.
    double (^divBlock) (double, double) = ^(double a, double b) {
                return a/b;
            };
    double quotient = divBlock(4.0, 2.0);
    

    附上介绍block的官方文档:
    https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html#//apple_ref/doc/uid/TP40007502-CH1-SW1

    总结:

    什么时候用什么方式?
    1,对于只对一个对象发出回调时,用目标-动作对
    2,对于对一个对象发出多条回调时,用协议
    3,对于要触发多个对象的回调时,用通告

    相关文章

      网友评论

      • Hello_kid:异步请求数据的时候会回调吗?
        Hello_kid:@FighterRay27 就是我现在比较迷茫,回掉的时候我在外边用回掉回来的数据,用之前怎么判断他有值了?
        FighterRay27:@yimao009 肯定会的~
      • d2a553cc00c5:oh 那么总结的话,Block应该在什么情况下用?
        FighterRay27:@codepapa 处理多线程问题,比如网络异步请求,还有动画,官方推荐用block写动画~
      • e6e1e6e274b7:没看懂:sob:收藏了以后回味
        e6e1e6e274b7:@FighterRay27 非常感谢:relaxed:。等会看看。
        FighterRay27:@Mr_ArvinD https://github.com/FighterRay27/Callback_Demo附上Demo~
      • 曾樑::+1::+1:
        FighterRay27:@曾樑 😁

      本文标题:谈谈iOS的回调

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