【问题标题】:Will this static var work like C?这个静态变量会像 C 一样工作吗?
【发布时间】:2015-07-16 16:26:34
【问题描述】:

我想在一个使用 Swift 2 的类上定义一个静态变量,它是一个 NSLock。

经过研究,我发现我必须使用结构,如下所示:

class Entity: NSManagedObject {

  struct Mechanism {
    static let lock = NSLock()
  }

  func myFunction -> NSArray {

    Mechanism.lock.lock()

    // do something

    Mechanism.lock.unlock()

  }

}

这会像 C 一样工作吗?我的意思是,第一次使用 Mechanism 时会创建一个静态锁定常量,后续调用将使用相同的常量?

我觉得这是不正确的,因为这条线

static let lock = NSLock()

正在初始化一个 NSLock。所以每次都会初始化一个新的。

如果这不是很快,我会这样做:

static NSLock *lock;

if (!lock) {
  lock = ... initialize 
}

如何在 Swift 2 中做同样的事情?

【问题讨论】:

    标签: ios macos swift swift2


    【解决方案1】:

    您说“经过研究,我发现我必须使用结构 [获取静态]。”然后你继续询问它是否真的是静态的,以及它在 Swift 2.0 中的变化。

    所以,有几点意见:

    1. 是的,结构模式中的这个静态将实现所需的行为,即只有一个 NSLock 将被实例化。

    2. 语言的重大变化是在 Swift 1.2(不是 2.0)中,它现在允许静态变量,完全消除了对 struct 的需要:

      class Entity: NSManagedObject {
      
          static let lock = NSLock()
      
          func myFunction() -> NSArray {
              Entity.lock.lock()
              // do something
              Entity.lock.unlock()
          }
      
      }
      

    【讨论】:

    • 如果我这样做,当我在函数中使用 lock.lock() 托盘时,它会给我一个错误 实体没有名为 lock 的成员
    • @SpaceDog 我的错。你必须引用Entity.lock,而不仅仅是lock
    【解决方案2】:

    说真的,没有人在 MacOS X 或 iOS 上使用 NSLock。在 Objective C 中,您使用 @synchronized。在 Swift 中,你可以使用这样的全局函数:

    func Synchronized (obj: AnyObject, _ block: dispatch_block_t)
    {
        objc_sync_enter (obj)
        block ()
        objc_sync_exit (obj)
    }
    

    首先,这使用递归锁。仅此一项就可以使您头疼不已。其次,它的工作粒度要细得多,可以锁定一个特定的对象。使用方法:

    func myFunction() -> NSArray {
        Synchronized(someObject) {
            // Stuff to do. 
        }
    }
    

    【讨论】:

    • 不适合我。如果我使用您的方案并将我的 executeFetchRequest 的 do/catch 块放入其中,它将给我一个错误 invalid conversion from throwing function of type ()throws -> Void to non-throwing function...
    • 能否请您重写您使用与我的 executeFetchRequest 块同步的部分?
    • 他可能正试图从 Synchronized 闭包中返回 NSArray 引用,但这是行不通的。您必须在闭包之前声明一些局部变量,让闭包更新该变量,然后让函数从闭包外部返回该变量。
    • 顺便说一句,gnasher,我不确定我是否与您一样对@synchronized 充满热情。在 Objective-C 中处理简单的东西非常方便,但速度较慢。并且说“没有人使用 NSLock”是夸大其词(例如,像 AFNetworking 这样的成熟框架使用它)。此外,Apple 建议我们不要再使用锁,而是使用队列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多