iOS回调,异步回调实现,以及创建可取消的任务

iOS下回调机制

在iOS下实现回调的方式

  • iOS下的代理模式实现方式利用protocol ,需要进行向外回调的实例中添加代理属性,当要进行回调的时候,直接调用自身代理属性的回调方法。类似java的interface,接口提供的就是一个回调功能.
  • 利用闭包(block),采用函数式编程思想,将一段代码作为参数传入方法中,在需要向外回调时,直接调用之前传进来的代码。相比功法一要简洁的多,不过小陷阱需要处理循环引用的风险

talk is cheap show me the code

  • AsynCanClePrint
 import UIKit
 typealias priBlock = (_ str:String) -> Void
 class AsynCanClePrint: NSObject {  
   private var    prblock:priBlock?
    var    prindatastring:String = ""
   var  index = 0
    var   iscancle  =   false
    override init() {
   super.init()
    }
    
    convenience  init(prblock:@escaping priBlock) {
        
 self.init()
self.prblock = prblock

    }
    //创建开始任务
    func start()  {
     
     let   dispa =   DispatchQueue(label: "back")
        dispa.async {
            weak  var tmpself = self

            while(true){
                Thread.sleep(forTimeInterval: 1.0)
                tmpself?.index += 1
                if   (!(tmpself?.iscancle)!) {
                    
                    if   tmpself?.prblock != nil{
                        
                        tmpself?.prblock!((tmpself?.getstr(index: (tmpself?.index)!))!)
                        
                    }
                    
                }
                else
                {
                    print("任务已取消")
                    return
                }
            }
        }
        
    }
    func  getstr(index:NSInteger) ->String {
        
        if index > prindatastring.characters.count || index < 0{
            return  "越界"
        }
        else{
        let  range = NSRange(location: index, length: 1)
        return  "\((prindatastring as NSString).substring(with: range))"
        }
        
    }
    
    //取消任务
    func cancel()  {
        iscancle = true
    }
}

ViewController

import UIKit
class ViewController: UIViewController {
    var    datas:String =  "利用闭包(block),采用函数式编程思想,将一段代码作为参数传入方法中,在需要向外回调时,直接调用之前传进来的代码。利用闭包(block),采用函数式编程思想,将一段代码作为参数传入方法中,在需要向外回调时,直接调用之前传进来的代码。利用闭包(block),采用函数式编程思想,将一段代码作为参数传入方法中,在需要向外回调时,直接调用之前传进来的代码。利用闭包(block),采用函数式编程思想,将一段代码作为参数传入方法中,在需要向外回调时,直接调用之前传进来的代码。利用闭包(block),采用函数式编程思想,将一段代码作为参数传入方法中,在需要向外回调时,直接调用之前传进来的代码。利用闭包(block),采用函数式编程思想,将一段代码作为参数传入方法中,在需要向外回调时,直接调用之前传进来的代码。利用闭包(block),采用函数式编程思想,将一段代码作为参数传入方法中,在需要向外回调时,直接调用之前传进来的代码。"
    @IBOutlet weak var mytext: UITextView!
    var    asynbackwork : AsynCanClePrint?
    override func viewDidLoad() {
        super.viewDidLoad()
        asynbackwork = AsynCanClePrint(prblock: { str in
            DispatchQueue.main.sync {
                weak    var tmp = self
                tmp?.mytext.text.append(str)
            }
            
   })
        asynbackwork?.prindatastring = datas
    }
@IBAction func begin(_ sender: Any) {
         asynbackwork?.start()
    }
@IBAction func cancle(_ sender: Any) {
        asynbackwork?.cancel()
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容