On 12 Nov 2012, at 12:56, "Gerriet M. Denkmann" <gerr...@mdenkmann.de> wrote:

> I have a property:
> 
> @property (readonly)  NSDictionary *someDictionary;           
> 
> This property should be computed on demand, and should be accessible by 
> several threads.
> 
> My current implementation is:
> 
> - (NSDictionary *)someDictionary;
> {
>       static NSDictionary *someDictionary;
>       static dispatch_once_t justOnce;
>       dispatch_once( &justOnce, ^
>               {
>                       // create a temp dictionary (might take some time)
>                       someDictionary = temp;
>               }
>       );
> 
>       return someDictionary;
> }
> 
> The first thread which needs someDictionary will trigger its creation. Ok.
> 
> But what happens when another thread wants to access someDictionary while it 
> is still being created? I guess it will receive just nil.
> This would be not correct; it really should wait until the dictionary is 
> ready.
> 
> How to achieve this? Use a lock? Use @synchronize?

This is completely the wrong way to implement a property.  The static variable 
will be shared between all instances.  Here's how you should be doing a lazy 
loaded var:

@implementation MyClass
{
    NSDictionary *_someDictionary
}

- (NSDictionary *)someDictionary
{
    static dispatch_once_t justOnce;
    dispatch_once(&justOnce, ^
        {
            someDictionary = [[NSDictionary alloc] initWithObjectsAndKeys: …… 
nil];
        });
    return someDictionary;
}

In answer to your threading question.  If multiple threads ask for the 
dictionary at once, the second one to hit the dispatch_once will block until 
the first one has finished the dispatch_once block, and then continue to 
execute (without touching the contents).  Thus, both threads will receive the 
same dictionary (assuming it's the same instance it's called on), and it will 
be allocated only once.

Tom Davie
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to