码迷,mamicode.com
首页 > 编程语言 > 详细

Swift 用Delegate和Block实现回调的Demo

时间:2015-12-11 14:53:05      阅读:463      评论:0      收藏:0      [点我收藏+]

标签:

一、有关回调

我们知道,执行函数的时候,一般都有return作为返回参数了,那有return了为什么还要回调呢?

回调是为了实现异步的返回,在某些特殊的情况下,比如你执行的函数是一个长时间运行的函数,并不能直接返回给你结果,为了不影响源程序其他步骤的执行,你得继续执行下去,等那边产生结果了再“主动告诉你”结果是什么。

(我考虑了一下,如果使用多线程+return的方式,也许也是能够实现异步的,但并不是万能的,因为子线程中不能做UI处理)

在iOS开发中,实现回调的方式有:Delegate和Block。前者用变量指针实现,后者用函数指针实现。

假如我现在有一个processData的类用来处理数据,处理完之后回调给主要的Class。

 

二、Swift中实现回调

1.代理模式:利用protocol+引用变量

processData.swift

//
//  ProcessData.swift

import UIKit
//定义协议
protocol callBackDelegate {
    func callbackDelegatefuc(backMsg:String)
}

class ProcessData: NSObject{
    //定义一个符合改协议的代理对象
    var delegate:callBackDelegate?
    func processMethod(cmdStr:String?){
        if((delegate) != nil){
            delegate?.callbackDelegatefuc("backMsg---by delegate")
        }
    }
}

ViewController.swift

//
//  ViewController.swift

import UIKit

//继承该协议
class ViewController: UIViewController,callBackDelegate{
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let process=ProcessData()

        //把process的delegate变量指针指向自己,那样process就能调用自己类里的函数了
        process.delegate=self

        //执行函数
        process.processMethod("startProcess")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    //delegate回调
    func callbackDelegatefuc(backMsg:String){
        print(backMsg)
    }
}

 

2.利用闭包实现:

闭包在Objective-C中被称为Block,在Swift中被成为Closure(在Java中称为Lambda)

   2.1利用闭包变量实现回调

processData.swift

//
//  ProcessData.swift

import UIKit

class ProcessData: NSObject{
    //定义block
    typealias fucBlock = (backMsg :String) ->()
    //创建block变量
    var blockproerty:fucBlock!
    
    func processMethod(cmdStr:String?){
        if let _ = blockproerty{
            blockproerty(backMsg: "backMsg---by block property")
        }
    }
}

ViewController.swift

//
//  ViewController.swift

import UIKit

class ViewController: UIViewController{
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let process=ProcessData()
        
        //block回调
        process.blockproerty={ (backMsg) in
            print(backMsg)
        }
        
        //执行函数
        process.processMethod("processStart")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

  2.2 把闭包写入函数作参数实现快速回调,可见这是一种代码最为简洁的方案

processData.swift

//
//  ProcessData.swift

import UIKit

class ProcessData: NSObject{
    //定义block
    typealias fucBlock = (backMsg :String) ->()

    func processWithBlock(cmdStr:String?,blockProperty:fucBlock){
        blockProperty(backMsg :"backMsg---by block inside func")
    }
}

ViewController.swift

//
//  ViewController.swift

import UIKit

class ViewController: UIViewController{
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let process=ProcessData()

        //函数内回调
        process.processWithBlock("bbb") { (backMsg) in
            print(backMsg)
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

 

PS:如果Block带返回值的情况下,Block是这样定义和调用的

//定义block
    typealias fucBlock = (backMsg :String) ->(String)

 

//函数内回调
        process.processWithBlock("bbb") { (backMsg) ->(String) in
            print(backMsg)
            return "get msg"
        }

 

 

swift:https://github.com/rayshen/SwiftClosure

oc:https://github.com/rayshen/callbackDemo

 

Swift 用Delegate和Block实现回调的Demo

标签:

原文地址:http://www.cnblogs.com/rayshen/p/5038734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!