Advertisement
Guest User

Untitled

a guest
Feb 27th, 2015
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.08 KB | None | 0 0
  1. public class ThreadSafeValue<T> {
  2. private let serialQueue = dispatch_queue_create("ThreadSafeValue queue", DISPATCH_QUEUE_SERIAL)
  3.  
  4. private var value: T
  5. public init(_ v: T) { value = v }
  6.  
  7. public func get<V>(action: (T) -> V) -> V {
  8. var v: V?
  9. dispatch_sync(serialQueue) {
  10. v = action(self.value)
  11. }
  12. return v!
  13. }
  14. public func access(action: (inout T) -> ()) {
  15. dispatch_sync(serialQueue) {
  16. action(&self.value)
  17. }
  18. }
  19.  
  20. public func get() -> T {
  21. return get { $0 }
  22. }
  23. public func set(v: T) {
  24. access { $0 = v; return }
  25. }
  26. }
  27.  
  28. let value = ThreadSafeValue("my precious")
  29.  
  30. // On one thread
  31. let v = value.get()
  32.  
  33. // On another thread
  34. value.set("asfsdfasd")
  35.  
  36. // On yet another thread
  37. let count = value.get { countElements($0) }
  38.  
  39. // On yet yet another thread
  40. let count = value.access { $0.doSomethingOnStringThatDoesNotReturnAValue() }
  41.  
  42. class MyClass {
  43. var string = ""
  44. }
  45.  
  46. let value = ThreadSafeValue("my precious")
  47.  
  48. // On one thread
  49. let v = value.get().string = "ksjadhf" // UNSAFE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement