`

[IOS]如何使用block来实现回调

    博客分类:
  • IOS
阅读更多

一.回调方法总结:

可以参考:https://www.jianshu.com/p/3ff91ef196d1

常用有三种:1.Delegate 和 DataSource 2.Notification 3.Blocks

 

二.Block

这里重点介绍Block这种用法:

在OC里面是Block,在swift里面叫closure,用法是类似的.

首先OC block简单参考如下:

https://www.jianshu.com/p/7d32ed28292f

 

这里面实现的是A跳转到B,B处理完,回调数据到A

但是这里面操作的时候有思维上的坑,首先是报野指针的错,然后通过判断是否为空发现,B中的block一直是空的,但是搞不懂为甚是空的.

然后我换了种方法,既然B那里是空的,那我就在A那里传一个block过去,操作如下:

参考:https://www.cnblogs.com/XYQ-208910/p/6257268.html

B.h:

@interface PingInfo : NSObject

- (void) addCallBack:(void(^)(NSString *)) callBackBlock ;

 

 B.m:

typedef void(^CallBackBlock) (NSString *);

@interface PingInfo()


@end

@implementation PingInfo{
    CallBackBlock _callBackBlock;
}

- (void) addCallBack:(void(^)(NSString *)) callBackBlock {
  
    _callBackBlock = callBackBlock;
    if(_callBackBlock){
        _callBackBlock(@"test-=-=-=-=-=");
        
    }
}

 

A.swift:

let pingInfo = PingInfo.init()
        
        pingInfo.addCallBack(
            { string in
                print("callback message: \(string)")
            }
        )

 

Perfect,没有任何问题.可以获得返回数据了.然后我就疑惑,是不是

 

pingInfo.callBackBlock = { string in
            print("callback message: \(string)")
        }

 这行代码OC不会识别呢,是不是swift和OC之间的处理问题呢,然后我又换了纯swift来试一次回调,参考操作如下:

https://www.jianshu.com/p/20407ee99346

发现B.swift的block还是空的.然后我对照了一下我的代码:

A.swift

pingInfo.passBlock() //错误
pingInfo.callBackBlock = { string in
            print("callback message: \(string)")
        }

B.m:

- (void)passBlock{
    
    if(_callBackBlock == NULL){
        NSLog(@"callBackBlock null ");
    }
    if(_callBackBlock){
        _callBackBlock(@"test-=-=-=-=-=");

    }
}

 

终于发现了我犯了一个愚蠢的错误.因为网上的参考代码并没有调用B中的方法来实现回调,而是直接跳转处理后回调,一般想法都认为block在B中声明,那么应该是在B中赋值的.其实问题就出现在这里,block应该是在A中赋值的,B中调用的,流程如下:

 OC(B)类里面声明--->swift controller(A)里面赋值----->OC类(B)里面调用------>swift controller(A)获得返回值

因此,我之前的做法直接使用了B类中的block调用,当然是空的,因为并没有执行赋值:

pingInfo.callBackBlock = { string in
            print("callback message: \(string)")
        }

 所以正确的是:

pingInfo.callBackBlock = { string in
            print("callback message: \(string)")
        }
pingInfo.passBlock() //正确

 一般思维惯性都是同一个类里面声明和赋值,但是block好特别,同一个类里面只是声明和调用,打一个比喻,好像买基金,基金的种类和涨跌就是block的声明和调用,但是如果你不买,就是不对一个block赋值(买多少,才知道有多少份额),这只基金是和你无关的,同理,基金涨跌了,对你来说是异步的,结果根据你的赋值(份额)回调(显示)给你就是了.

 

综上,block有两种操作方式,要不就通过方法来传给B来使用,要不就直接赋值,其实本质都是一样的,和上面的基金例子一样,是否通过代理来买而已.

 

分享到:
评论

相关推荐

    iOS的block回调

    总的来说,iOS的Block回调使得代码更加简洁、易读,减少了回调函数的使用,提高了代码的可维护性。熟练掌握Block回调机制对于iOS开发者来说至关重要,因为它贯穿于许多核心API和框架中。通过实践和理解Block的工作...

    IOS block回调代码实例Demo

    总之,"IOS block回调代码实例Demo"是一个很好的学习资源,它展示了如何在iOS应用中使用Block进行回调,这对于理解和掌握iOS开发中的异步编程至关重要。通过深入研究这个Demo,开发者可以更好地运用Block来优化代码...

    ios-block 回调.zip

    例如,可能会有一个按钮点击事件,当用户点击按钮时,启动一个网络请求,并在请求完成后通过Block回调更新UI。 总结一下,"ios-block 回调.zip"中的"CallbackDemo"项目可能涵盖了以下知识点: 1. Block的定义和使用...

    ios-block回调 仅仅是回调.zip

    在iOS开发中,Block是一...总之,"ios-block回调 仅仅是回调.zip"这个资源包可能涵盖了Block在各种回调场景下的实践,通过学习BlockReturnTest的实现,你可以更深入地理解和掌握Block的使用技巧,提升你的iOS开发能力。

    iOS中Block的回调使用和解析详解

    Block是Objective-C中的一种强大的特性,它允许我们将...总之,理解并熟练掌握Block回调是iOS开发中的一项重要技能。通过这个例子,你应该对Block回调有了更深入的理解,能够将其应用到实际项目中去解决类似的需求。

    Delegate&Block作回调

    总结来说,Delegate和Block都是iOS开发中实现回调的重要工具,它们各有优势和适用场景。了解并熟练掌握这两种机制,对于提升iOS应用的开发效率和代码质量具有重要意义。通过分析和比较Delegate及Block的使用,开发者...

    iOS block使用总结

    Blocks是Objective-C的语法扩展,后来也被引入到Swift中,对于处理异步操作、事件回调、简化代码结构等方面具有重要作用。下面将对iOS Block的使用进行详细讲解。 1. **Block的定义** Block可以看作是一种匿名函数...

    iOS Block使用教程

    - Block可以作为函数的参数,这使得我们可以把复杂的逻辑封装到函数中,然后通过Block进行回调。 - 函数也可以返回一个Block,这样可以创建出灵活的API设计,比如网络请求库的completion handler。 5. **Block与...

    ios-Scrollview 滚动选择菜单block回调.zip

    本示例"ios-Scrollview 滚动选择菜单block回调.zip"着重展示了如何利用`UIScrollView`来创建一个滚动选择菜单,并且实现了一个基于Block的回调机制。这种回调机制在用户完成选择后,可以将选中的值传递到其他部分的...

    block回调测试

    通过这个项目,开发者可以深入理解Block回调的实现和参数传递的细节,这对于编写高效、简洁的iOS代码至关重要。在实际应用中,应遵循良好的编程习惯,注意防止内存泄漏和循环引用,确保Block的正确使用和释放。

    iOS块回调代替代理模式演示

    然而,随着Apple引入了 blocks(块)这一特性,开发者有了另一种选择——使用块回调来替代传统的代理模式。块回调提供了一种更加简洁、直观的方式来处理事件响应,特别是在处理异步操作时。 代理模式的核心是定义一...

    ios-block 多参数传值.zip

    在iOS应用开发中,Block的使用非常常见,特别是在处理异步操作、事件回调或者复杂逻辑控制时。 Block的基本语法结构如下: ```swift ^(参数列表) -> 返回类型 { // Block体,包含执行的代码 } ``` 例如,一个...

    ios-block回调的地图.zip

    本项目“ios-block回调的地图.zip”聚焦于利用系统地图实现定位与反编码,并提供了一个二次封装的类别——SYCLLocation,以简化开发流程。下面我们将详细探讨这个主题。 首先,`SYCLLocation`是开发者potato512在...

    iOS block实现,内存管理

    在iOS和OS X开发中,Block常用于异步操作的回调、并发处理等场景。本文将深入探讨Block的实现以及与内存管理的关系。 Block可以视为匿名函数,它们在C语言的基础上进行了扩展。在Objective-C中,Block主要有以下几...

    iOS Block 的使用, 包括传值, 基本用法

    通过以上内容,我们可以看到Block在iOS开发中的重要作用,无论是在简化代码、处理回调还是实现异步操作等方面都具有极大的便利性。了解和熟练掌握Block的使用,能有效提升iOS开发的效率和代码质量。在实际项目中,...

    [ios]Block分离DataSource -ios升级日记2

    在iOS开发中,Block是一种强大的语法特性,常用于回调、异步处理等场景。然而,当Block被用作数据源(DataSource)时,可能会导致一些问题,如内存泄漏、代码结构混乱等。本文将深入探讨如何将Block分离出DataSource...

    ios Block和代理的对比

    在iOS开发中,Block和代理是两种常用的回调机制,它们都可以用来实现对象间的通信,但具体用法和特性有所差异。下面将详细讲解Block和代理的对比,以及它们各自的应用场景。 首先,Block是一种内联函数,它可以捕获...

    ios-block反向传值.zip

    "ios-block反向传值.zip"这个压缩包文件主要关注的是如何利用Block来实现反向传值,即从子线程或异步操作中将结果传递回主线程或调用者。 Block的基本语法: Block本质上是一个对象,它可以捕获并存储其所在上下文...

    ios-block逆传值页面间的.zip

    在没有导航控制器的场景下,或者不希望通过导航控制器的回调来处理这种情况时,Block提供了一种灵活的解决方案。 在"blockValuePage"这个示例中,可能包含了两个页面:一个是发起传值的页面(可能是ViewControllerA...

Global site tag (gtag.js) - Google Analytics