精华内容
参与话题
问答
  • swift回调的实现

    千次阅读 2017-05-18 15:04:49
    最近在学习ios开发,刚刚学习了一下swift我们都知道访问网络一般都是通过回调的形式来实现的,这里我搜索了下,学习到了3种方法,当然肯定有其他的方式,不过常用或者说比较容易理解的就是这三种一、使用protocol的方式...

    最近在学习ios开发,刚刚学习了一下swift

    我们都知道访问网络一般都是通过回调的形式来实现的,这里我搜索了下,学习到了3种方法,当然肯定有其他的方式,不过常用或者说比较容易理解的就是这三种

    一、使用protocol的方式

    首先声明一个protocol NetCallback,类似于java中的接口/抽象类,里面一个方法
    然后在类中输入声明一个方法,参数类型是NetCallback
    
    import UIKit
    
    protocol NetCallBack {
        func success(result:String)
    }
    
    import UIKit
    
    class NetHelper: NSObject {
    
        static func get(url:String ,callback:NetCallBack){
            NSLog("url=%@", url)
            callback.success(result: "访问\(url)成功");
        }
    
    }
    

    调用

    struct cb:NetCallBack{
        func success(result:String){
            NSLog("结果是:%@", result)
        }
    }
    NetHelper.get(url: "www.baidu.com", callback: cb() as NetCallBack)

    这样就可以实现调用,也很好理解,声明一个构造体实现了NetCallBack协议,然后将构造体cb作为一个参数传入,方法体内就会掉到success

    二、使用闭包作为目标字段的方式

    闭包的话,可以参考下网上的blog帖子啥的

    class NetHelper: NSObject {
    
        var url:String
    
        static func get(url:String ,callback:NetCallBack){
            NSLog("url=%@", url)
            callback.success(result: "访问\(url)成功");
        }
    
        func exec(){
            getCallBack!("result")
        }
    
        var getCallBack:((String)->(Void))?
    
        init(url:String){
            self.url = url
        }
    
    }
    

    这里的getCallBack声明了一个变量类型是需要传String参数,没有返回值

    调用

    let helper:NetHelper = NetHelper(url: "www.sina.com")
    helper.getCallBack = {(result)->Void in
        NSLog("结果为:\(result)")
    }
    
    helper.exec()

    这里大概就是声明了一个对象,设置对象的callBack为自己定义的闭包,最后log输出 结果为:result

    三、直接在方法中声明闭包作为参数

    这也是比较被推荐的一个,因为使用时结构清晰,也容易理解

    class NetHelper: NSObject {
    
        var url:String
    
        init(url:String){
            self.url = url
        }
    
        func exec(cb: (_ result:String)->()){
            NSLog("访问%@", url)
            cb("json");
        }
    }

    使用时

    let helper:NetHelper = NetHelper(url: "www.sina.com")
    helper.exec { (result) in
        NSLog("闭包回调结果是:\(result)")
    }

    这里输出结果为: 闭包回调结果是:json

    结语

    这三种方式,根据自己的实际需要来用,其实我个人觉得第三种比较合适,将请求封装,回调也比较清楚,失败的回调下次再研究

    展开全文
  • Swift的delegate和notifition机制 文件kvoDemo.swift import Foundation @objc // 需要打开objc标识,否则@optional编译出错 //协议,,类似java的接口 定义这个接口,里面定义方法 protocol ...
    Swift的delegate和notifition机制
    文件kvoDemo.swift


    import Foundation




    @objc   // 需要打开objc标识,否则@optional编译出错


    //协议,,类似java的接口 定义这个接口,里面定义方法
    protocol kvoDemoDelegate {
        func willDoSomething()
        optional  func didDoSomething()  //可选实现,
    }
    //初始化全局变量notifition的名字
    let ntfname = "test_notification"


    class kvoDemo : NSObject //不写NSObject默认就是从NSObject来的
    {
    //声明这个接口为delegate
        var delegate: kvoDemoDelegate!
        
          override init()
        {
            
        }
        //定义一个方法执行协议的方法
        func doSomething()
        {
            if let _ = self.delegate
            {
                delegate!.willDoSomething()
            }
            
            for _ in 1...5
            {
                print("i'm doing now,don't touch me,please.")
            }
            
            if let _ = self.delegate
            {
                delegate!.didDoSomething!()
            }
        }
        //发送notifition消息方法
        func notificationPost()
        {
            let ntf = NSNotificationCenter.defaultCenter()
            ntf.postNotificationName(ntfname, object :nil, userInfo:nil)
        }
        
        deinit
        {
            
        }
    }


    第二个文件ViewController.swift
    import UIKit
    //实现协议delegate
    class ViewController: UIViewController ,kvoDemoDelegate{




        //实现接口必须实现的方法,里面写方法的实现
        //delegate
        func willDoSomething()
        {
            print("i will do it.")
        }
        
        func didDoSomething()
        {
            print("i had do it.")
        }
        
        //监听notifition发出的消息事件的方法
        //notification
        func onRecviceNotification(notification:NSNotification)
        {
            print("Recevice notification \(notification)")
        }
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            //实例化kvoDemo类
            let kvo = kvoDemo()
            //绑定   这里是比java回调中多出来的一步貌似
            kvo.delegate = self
            //执行kvo中定义的方法  这方法中间就会执行到协议中的方法,然后就会执行本类中实现的协议的方法
            kvo.doSomething()
            
            //注册notifition,监听
            let ntf = NSNotificationCenter.defaultCenter()
            //接受到消息就会执行方法onRecviceNotification
            ntf.addObserver(self, selector:"onRecviceNotification:", name :ntfname, object : nil)
            //发送notifition消息
            kvo.notificationPost()
            //取消观察者的身份
            ntf.removeObserver(self)
        }




        


    }
    展开全文
  • swift - 回调

    千次阅读 2016-07-30 20:50:45
    一、回调函数 回调函数就是允许用户A把需要调用的方法B的指针作为参数注册给另一个函数C,以便该函数在...在swift中有同步和异步两种形式的回调函数: 同步回调函数 异回调函数步 C调用方法B,B可以是函数或者closur

    一、回调函数

    回调函数就是允许用户A把需要调用的方法B的指针作为参数注册给另一个函数C,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
    回调函数B不由该函数的实现方A直接调用,而是在特定的事件或条件发生时由另外的一方C调用,用于对该事件或条件进行响应。

    在swift中有同步和异步两种形式的回调函数:

    同步回调函数 异回调函数步
    C调用方法B,B可以是函数或者closure C调用函数B并使B在另一线程(也可以是相同线程)上运行
    B返回之前C处理block状态 B和C运行在不同的线程,不会互相block。
    B返回之后C继续执行 B结束后会通知C

    主线程不能被block住,否则
    - UI无响应
    - APP卡住
    因此如果回调函数要执耗时且有可能失败的操作,建议使用异步式的回调函数

    同步回调函数有时用于作为delegation的替代品。

    二、同步回调函数的例子

    func C( x : Double, fn : (Double -> Double) ) -> Double?
    {
        ....
        return fn(x)
    }
    //调用者A
    let ret = C(0.01, fn : B)

    例子中fn是一个回调函数,由sync的用户动态地决定sync操作触发什么函数
    如果fn是一个耗时且可能出错的函数,例如访问网络数据。那么就不能让fn在主线程上运行。要把它改成异步调用的方式。

    三、异步回调函数(一)

    let P = NSBlockOperation() {
        let res = C(0.01){B}
        let Qres = NSBlockOperation() {
            if let p = ret {...}
            else {...}
        }
        NSOperationQueue.mainQueue().addOperation(Qres)
    }
    let Q = NSOperationQueue()
    Q.addOperation(P)
    1. 将C和B封装到一个操作P中。
      P是一个使用了trailing closure语法的closure
    2. 把P加入到操作队列Q中,Q队列中的操作会在一个独立的线程中执行
    3. 修改操作P,将B完成后的后续处理封装到操作Qres中
    4. 把Qres加入到主线程的操作队列

    效果:
    在另一个线程执行P中的C
    C执行结果后执行主线程中的Qres
    在另一个线程上执行P时,主线程不受影响

    四、异步操作的回调函数(二)

    func C(x : Double, fn : Double -> Double, completion : Double? -> Void) {
        let P1 = {
            ...
            ret = fn(x)
        }
        let P2 = {
            completion( ret )
        }
        NSOperationQueue.mainQueue.addOperationWithBlock(P2)
    }
    //调用
    C(0.01, fn : B, completion : comp)

    1.把调用回调函数的过程与结果分别封装到两个operation中
    2.在其它线程执行P1
    3.P1结束后在主线程执行P2

    展开全文
  • swift回调方法/回调函数

    千次阅读 2017-11-09 18:46:46
    // A类代码 class A{ func huidiao(){ let tag:String = "XunDianGuanLiControlle" // 数据处理的B类型 let UIPickerViewPL = B() // 设置数据,传tag(tag是自定义的,可传可不传),getValueClosure 这个方法是...
    // A类代码
    class A{
        func  huidiao(){ 
            let tag:String = "XunDianGuanLiControlle"
            // 数据处理的B类型
            let UIPickerViewPL = B()
            // 设置数据,传tag(tag是自定义的,可传可不传),getValueClosure 这个方法是必须的,这个方法创建在本类
            UIPickerViewPL.UIPivkerInit(tag: tag, closuer:getValueClosure)
            // 设置B类背景透明度
            UIPickerViewPL.view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)
            // 显示B类,自下而上显示
            self.present(UIPickerViewPL, animated: true, completion: nil)
        }
    
    // B类中回调的方法,参数自定义
    func getValueClosure(tag: String,result:[Int:Int]) {
            for (k,v) in result {
                print("\(tag)|\(mPinPaiPickerData[k]![v]?.name)")
            } 
        }
    }
    
    
    
    
    // B类代码
    // 这句代码没理解什么意思,应该是声明类型,我是写在class上面的
    typealias sendValueClosure = (_ tag: String,_ result:[Int:Int])->Void
    class B{
        // 请求tag
        var mStringTag:String!
    
        // 请求闭包函数
        var mQingQiuBiBao:sendValueClosure?
    
        // TODO:初始化赋值,在A类中调用此方法赋值
        public func UIPivkerInit(tag:String,closuer:sendValueClosure?){
            self.mStringTag = tag
            self.mQingQiuBiBao = closuer
        }
        func BhuiDiao(){
            if(mQingQiuBiBao != nil){
                // 这里会回调A类里面的getValueClosure方法,这里的参数就是getValueClosure方法的参数
                mQingQiuBiBao!(self.mStringTag,[1:1])
            }
            // 回跳(这个是present的返回,而且有动画,自上而下隐藏)
            self.dismiss(animated: true, completion: nil)
        }
    }
    展开全文
  • Swift - 回调机制

    2016-03-14 20:42:55
    1.类似于TableViewCell中的didselected方法的直接回调2.Closure闭包回调import UIKitclass ViewController: UIViewController { var str:String! overridefunc viewDidLoad() { super.viewDidLoad() let vc2 =
  • swift支付宝回调问题

    2020-08-26 11:55:17
    swift 支付宝回调问题 很少写博客,写的不够美观。希望看的读者见谅。 这篇文章是自己使用支付宝支付时,遇到的问题的总结。希望对遇到问题的有帮助。 现在开始吧 1、需要支付宝支付的地方添加SDK代码 ///调取支付宝...
  • swift 方法中定义回调Being able to work on diverse projects gave me the chance to be in contact with several types of developers and codebases. Besides their core differences, what stood out to me ...
  • UITableView内部的UITableViewIndex,实现滑动事件的监听回调
  • Alamofire - swift 代理请求封装,闭包回调封装
  • swift 中的闭包回调

    2016-04-18 11:37:28
    @noescape在swift3.0中已经被废弃,在swift3.0中@noescape被用作一个默认值。 @escaping属性写在参数类型的前面而不是参数名称的前面。这是swift3里一个新的点。   这里需要先介绍一下escape的概念。当一个闭包...
  • swift中的block回调

    2015-07-28 09:23:38
    // blockDemo.swift  // swiftDemo  //  // Created by apple on 14-6-29.  // Copyright (c) 2014年 fengsh. All rights reserved.  //    import Foundation    //无参无返回值  type...
  • Swift 异步加载回调 callBack 实现

    千次阅读 2017-11-02 19:16:53
    异步加载是我们经常使用的方法,不仅能够提高执行效率,而且用户体验也大大提高。由于是异步执行,得到的结果时机是未知的,不能直接使用 return 来返回得到的结果。 在这种情形下我们可以使用 Protocol 关键字声明...
  • 第一个VC import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let secondViewController = SecondViewController() ... secondViewC
  • Swift与OC闭包回调对比

    2016-08-22 17:10:09
    在iOS开发中,实现回调的方式有:Delegate和Block。前者用变量指针实现,后者用函数指针实现...本文主要简单记录下 Swift使用闭包回调与OC的Block的使用差异。 1、定义 OCtypedef void(^fucBlock)(NSString *backMsg)
  • 1.创建一个MyResponse类,继承自NSObject。这个类的变量success表示回调结果,message表示回调信息: class MyResponse: NSObject { var success:Bool = false var message: Str...
  • 封装了一个类,暴露出的一个方法,在外部引用时,给出回调blcok 封装类: //MARK:登录 public func loginWithToken(token:String,loginSuccessBlock:(()->Void),loginErrorBlock:(()->Void)) { ...
  • /**  (2)闭包表达式的语法  fun funcName(参数) -> 返回值类型 {      }    // 没有函数名,是个匿名函数,必须有参数类型  返回值类型;也就是有函数类型。 ...关键字,有执行语
  • @objc func quaryAllBalances(quaryBalances: @escaping (NSDictionary) -> Void){ let allAccounts = HPBUserMannager.shared.walletInfos var allAddress: [String] = [] allAccounts...
  • 最近在学习使用Swift,自己也尝试使用Swift写一些...下面就来看看,如何使用闭包来实现OC中的block回调事件; 本demo的功能很简单: 两个控制器,其中一个控制器上有一个按钮,点击按钮,将字符串传递到另一个控制器,当然第二
  • KVO 在iOS应用场景还是挺多的, 虽然Swift新增属性观察器,但是在深层观察属性,KVO在一些场景还是比较方便。 环境 Swift Version:4.0 Xcode:10.1 (10B61) iphoneOS:12.1   问题 先看下代码,我...

空空如也

1 2 3 4 5 ... 17
收藏数 329
精华内容 131
关键字:

swift回调