麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Swift > 正文

swift中利用runtime交換方法的實現示例

2020-03-09 17:31:53
字體:
來源:轉載
供稿:網友

前言

Runtime介紹

學習一個東西至少要先知道它是個啥,你一定聽說過“運行時是 Objective-C 的一個特色”,這里的“運行時”就是指 runtime 了。

老的方式initialize現在已經不適用了,需要用新的方式代替。

思路: 定義一個啟動的協議,在app完成啟動的方法里把需要做method swizzle的類跑一邊協議的方法

第一種

1、Step One

 protocol SelfAware: class {  static func awake() } class NothingToSeeHere {  static func harmlessFunction() {   let typeCount = Int(objc_getClassList(nil, 0))   let types = UnsafeMutablePointer<AnyClass?>.allocate(capacity: typeCount)   let autoreleasingTypes = AutoreleasingUnsafeMutablePointer<AnyClass?>(types)    objc_getClassList(autoreleasingTypes, Int32(typeCount))   for index in 0 ..< typeCount { (types[index] as? SelfAware.Type)?.awake() }   types.deallocate(capacity: typeCount)  } }

2、step two

 extension UIApplication {   private static let runOnce: Void = {    NothingToSeeHere.harmlessFunction()   }()  override open var next: UIResponder? {    // Called before applicationDidFinishLaunching    UIApplication.runOnce    return super.next  } } 

3、step three

遵循協議SelfAware,實現awake()

第二種(類似第一種)

1、創建一個swizzle注入的協議

public protocol SwizzlingInjection: class { static func inject()}

2、創建swizzle helper

open class SwizzlingManager { //只會調用一次的方法 private static let doOnce: Any? = {  UIViewController.inject()  return nil }()  open static func enableInjection() {  _ = SwizzlingManager.doOnce }}

3、給UIApplication 創建分類調用那個一次方法

extension UIApplication{ open override var next: UIResponder?{  SwizzlingManager.enableInjection()  return super.next }}

4、在你需要的類中遵循注入協議

extension UIViewController: SwizzlingInjection{  public static func inject() {  //確保不是子類  guard self === UIViewController.self else { return }    DispatchQueue.once(token: "com.moglo.urmoji.UIViewController") {   //do swizzle method  } }}

once只執行一次的方法

public extension DispatchQueue {  private static var _onceTracker = [String]()  public class func once(file: String = #file, function: String = #function, line: Int = #line, block:()->Void) {  let token = file + ":" + function + ":" + String(line)  once(token: token, block: block) }  /**  Executes a block of code, associated with a unique token, only once. The code is thread safe and will  only execute the code once even in the presence of multithreaded calls.    - parameter token: A unique reverse DNS style name such as com.vectorform.<name> or a GUID  - parameter block: Block to execute once  */ public class func once(token: String, block:()->Void) {  objc_sync_enter(self)  defer { objc_sync_exit(self) }  if _onceTracker.contains(token) {   return  }  _onceTracker.append(token)  block() } //delay typealias Task = (_ cancel : Bool) -> Void @discardableResult static func delay(time : TimeInterval, task: @escaping () -> ()) -> Task? {    func dispatch_later(block : @escaping () -> ()) {   DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + time , execute: block)  }    var closure : (() -> ())? = task  var result : Task?  let delayedClosure : Task = {   cancel in   if let internalClosure = closure {    if cancel == false {     DispatchQueue.main.async(execute: internalClosure)    }   }   closure = nil   result = nil  }    result = delayedClosure  dispatch_later { () -> () in   if let delayedClosure = result {    delayedClosure(false)   }  }  return result }  static func cancel(task : Task?) {  task?(true) }}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中文字幕www. | 国产精品久久久久久久久久iiiii | 国产91精品久久久久久 | jizzyouxxxx| 日韩视 | 国产成人77亚洲精品www | 91色爱| 国产在线观看91精品 | 国产精品久久久久久影视 | 看毛片电影 | 激情网站视频 | 精品国产91久久久久久浪潮蜜月 | 成人午夜淫片a | 免费国产人成网站 | h色视频网站 | 日本视频免费看 | 99re热视频这里只精品 | 欧美一级黄色影院 | 久久精品.com| 得得啪在线视频 | 一区二区三区在线观看视频 | 91久久夜色精品国产网站 | 一区二区三区在线观看视频 | 久久久国产一级片 | 一区二区三区在线观看国产 | 一级看片免费视频 | 极品xxxx欧美一区二区 | 一级毛片在线免费观看视频 | 中文字幕涩涩久久乱小说 | 黄色7777| 午夜视频免费播放 | 国产毛片aaa一区二区三区视频 | 久久久三级免费电影 | 欧美 日韩 国产 在线 | 成人毛片视频免费 | 一级做a爰性色毛片免费1 | 少妇一级淫片免费放正片 | av大全在线播放 | 中文字幕免费在线观看视频 | 午夜在线观看视频网站 | 一本到免费视频 |