+ (GrabClass *)grab{
static GrabClass * ngrab = nil;
if (ngrab==nil)
{
ngrab=[[GrabClass alloc]init];
}
return grab;
}
W swoim programie wykorzystałem wiele singletonów. Jeśli zrobię to w ten sposób, istnieje jednak szansa, że metoda grab zostanie wywołana przez różne wątki jednocześnie.
Jak tego uniknąć?
Moje obecne rozwiązanie to:
+ (GrabClass *)grab{
static GrabClass * ngrab = nil;
[Tools DoSomethingWithSynchronize:^{
if (ngrab==nil)
{
ngrab=[[GrabClass alloc]init];
}
}];
return grab;
}
Gdzie
+(void)DoSomethingWithSynchronize:(void (^)())block
{
@synchronized (self)
{
[self singleton].lockToMakeSureThatOnlyOneThreadAccessThis=[NSThread currentThread];
[self breakIfLock]; //should not be called
block();
[self singleton].lockToMakeSureThatOnlyOneThreadAccessThis=nil;
}
}
Wygląda na przesadę. Zastanawiam się, czy istnieje lepsze standardowe rozwiązanie
Odpowiedzi:
1 dla odpowiedzi № 1Możesz uzyskać bardzo dobry przykład i dokumentację tutaj.
Możesz po prostu użyć @synchronized(self)
zsynchronizować operacje.