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()
}
}