How To Safely Invoke a Block
How To Safely Invoke a Block
- Subject: How To Safely Invoke a Block
- From: Andreas Grosam <email@hidden>
- Date: Wed, 21 Nov 2012 11:56:45 +0100
I've defined a class Foo that defines a block via a property:
@property (copy) void (^progressHandler)(RXProgressState progressState, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite);
The property is synthesized by the compiler, ARC enabled.
The block is usually invoked on a private thread for several times until an action finishes (an asynchronous NSURLConnection).
A client of class Foo should be able to set the block property at any time from any thread - that is it should also be able to set the block to NULL. Now, I'm worried about thread safety.
First, is it a good measurement to use a property with the "atomic" attribute?
Secondly, I'm invoking the block as follows (from within a NSURLConnectionDelegate method):
progress_handler_block_t block;
if ( (block=self.progressHandler) != NULL) {
block(RXProgressStateStart, 0, self.source.size);
}
since it appears to me, that
if (_progressHandler) {
_progressHandler(RXProgressStateStart, 0, self.source.size);
}
or
if (self.progressHandler) {
self.progressHandler(RXProgressStateStart, 0, self.source.size);
}
isn't thread safe.
Your comments are welcome!
Regards
Andreas
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden