NSRecursiveLock递归锁提供了一个方法lock(before:),用于在多线程情况下,去尝试请求一个递归锁,然后根据返回的布尔值,来做相应的处理。如下代码所示,是一个正常的递归锁调用过程:

let lock = NSRecursiveLock()
var recursiveMethod: ((Int) -> Void)! = nil
   
recursiveMethod = { value in
  
  defer {
      lock.unlock()
  }
  
  lock.lock()
  
  guard value > 0 else {
      return
  }
  
  print(value)
  sleep(2)
  recursiveMethod(value - 1)
}
   
DispatchQueue.global().async {
  
  print("start")
  recursiveMethod(5)
  print("end")
}

在这个场景下,如果我们想另起一个线程,并且尝试去获取这个递归锁,则可以如下代码处理:

DispatchQueue.global().async {
  sleep(2)
  
  let flag = lock.lock(before: Date(timeIntervalSinceNow: 1))
  if flag {
      print("lock before date")
      lock.unlock()
  } else {
      print("fail to lock before date")
  }
}

当然这种情况下会失败,其输出如下所示。如果将lock(before:)中的时间设置长一点,则会打印出”lock befor date”。