# Swift: What is the best way to do Safe Thread Concurrent or NSLock

**URL:** <https://forums.kodeco.com/t/swift-what-is-the-best-way-to-do-safe-thread-concurrent-or-nslock/129233>\
**Category:** iOS\
**Created:** [January 4, 2021, 4:22pm UTC](https://forums.kodeco.com/t/swift-what-is-the-best-way-to-do-safe-thread-concurrent-or-nslock/129233 "2021-01-04T16:22:12Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![emoonadev](https://assets.chunter.kodeco.com/user_avatar/forums.kodeco.com/emoonadev/32/102075_2.png) [@emoonadev](https://forums.kodeco.com/u/emoonadev)\
**Post date:** [January 4, 2021, 4:22pm UTC](https://forums.kodeco.com/t/swift-what-is-the-best-way-to-do-safe-thread-concurrent-or-nslock/129233/1 "2021-01-04T16:22:13Z")

</div>

What is the best way to do `Safe Thread`?

`NSLock` or a `Queue` with `.concurrent` attribute for the following case, and why?

Using `NSLock`:

```auto
class Observable<T> {

	typealias Observer = (_ observable: Observable<T>, T) -> Void
	
	private var observers: [Observer]
	private let lock = NSLock()
	private var _value: T

	var value: T {
		get {
			lock.lock()
			let value = _value
			lock.unlock()
			return value
		}
		set {
			lock.lock()
			_value = newValue
			lock.unlock()
		}
	}

	
	init(_ value: T) {
		self._value = value
		observers = []
	}

	func observe(observer: @escaping Observer) {
		self.observers.append((observer))
	}

	private func notifyObservers(_ value: T) {
		DispatchQueue.main.async {
			self.observers.forEach { [unowned self](observer) in
				observer(self, value)
			}
		}
	}

}

```

Using `Queue`:

```auto
class SecondObservable<T> {

	typealias Observer = (_ observable: SecondObservable<T>, T) -> Void
	
	private var observers: [Observer]
	private let safeQueue = DispatchQueue(label: "com.observable.value", attributes: .concurrent)
	private var _value: T

	var value: T {
		get {
			var value: T!
			safeQueue.sync { value = _value }
			return value
		}
		set {
			safeQueue.async(flags: .barrier) { self._value = newValue }
		}
	}

	
	init(_ value: T) {
		self._value = value
		observers = []
	}

	func observe(observer: @escaping Observer) {
		self.observers.append((observer))
	}

	private func notifyObservers(_ value: T) {
		DispatchQueue.main.async {
			self.observers.forEach { [unowned self](observer) in
				observer(self, value)
			}
		}
	}

}

```

---

<div class="post-metadata">

**Author:** ![system](https://s3.amazonaws.com/cdn.raywenderlich.com/community/forum-assets/noun-game-ghost-878668.png) [@system](https://forums.kodeco.com/u/system)\
**Post date:** [June 20, 2021, 8:22am UTC](https://forums.kodeco.com/t/swift-what-is-the-best-way-to-do-safe-thread-concurrent-or-nslock/129233/2 "2021-06-20T08:22:17Z")

</div>

This topic was automatically closed after 166 days. New replies are no longer allowed.
