Fix SDWebImageDownloadOperation imageData multi-thread issue. #2011
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.
Force acess to imageData on the same delegate queue to solve non thread safe issue. And ensure image process and completion block with non-mutable data
New Pull Request Checklist
I have read and understood the CONTRIBUTING guide
I have read the Documentation
I have searched for a similar pull request in the project and found none
I have updated this branch with the latest master to avoid conflicts (via merge from master or rebase)
I have added the required tests to prove the fix/feature I am adding
I have updated the documentation (if necessary)
I have run the tests and they pass
I have run the lint and it passes (
pod lib lint
)This merge request fixes / reffers to the following issues: ...
Pull Request Description
This PR is about #1998
The NSMutableData
imageData
can be set to nil during-(void)reset
call and some call inURLSessionDelegate
. So there may be an data race that thereset queue
anddelegate queue
is not equal, and this can cause multi-thread problem.We can make all the access(getter and setter) to
imageData
into an single queue to ensure this. But since all the acess toimageData
is underNSURLSessionDelegate
call, so we just need to change thatself.imageData = nil
in to the same delegate queue. So I get the queue from the session and put that nil process into it.And moreover. The
imageData
is mutable but the completion block is an immutableNSData
. We should always use copy to get the immutable instance to avoid modification while process.(Since NSData supportsCopy on Write
and many cases this would not cause any performance issue)