Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Right now we do a
DispatchQueue.main.sync
in order to make sure that the test observer is registered on the main thread.sync
is always a dangerous operation, and it turns out we can deadlock. It can be reproduced with the following 3 steps:This causes a deadlock because the background thread has already entered into a
dispatch_once
to resolvestatic var current
but is currently waiting on the main thread to finish its work. And simultaneously the main thread has now also entered thedispatch_once
, and hence a deadlock.The fix is perhaps a little risky, but we think it should be ok. We are going to allow adding the test observer in
main.async
if the dependency is first being accessed on a background thread. It seems theoretically possible that the test observer will not be registered by the time the test ends, but we haven't been able to find a situation in which that occurs.