Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class ThreadSafeValue<T> {
- private let serialQueue = dispatch_queue_create("ThreadSafeValue queue", DISPATCH_QUEUE_SERIAL)
- private var value: T
- public init(_ v: T) { value = v }
- public func get<V>(action: (T) -> V) -> V {
- var v: V?
- dispatch_sync(serialQueue) {
- v = action(self.value)
- }
- return v!
- }
- public func access(action: (inout T) -> ()) {
- dispatch_sync(serialQueue) {
- action(&self.value)
- }
- }
- public func get() -> T {
- return get { $0 }
- }
- public func set(v: T) {
- access { $0 = v; return }
- }
- }
- let value = ThreadSafeValue("my precious")
- // On one thread
- let v = value.get()
- // On another thread
- value.set("asfsdfasd")
- // On yet another thread
- let count = value.get { countElements($0) }
- // On yet yet another thread
- let count = value.access { $0.doSomethingOnStringThatDoesNotReturnAValue() }
- class MyClass {
- var string = ""
- }
- let value = ThreadSafeValue("my precious")
- // On one thread
- let v = value.get().string = "ksjadhf" // UNSAFE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement