私がやろうとしているのは、@synchronized
ディレクティブを使用して、シングルトン オブジェクトが一度に複数のスレッドからアクセスされないようにすることです。また、オブジェクトへの変更を失わないようにできる限り努力することが非常に重要であるため、そのシングルトン オブジェクトが変更されるたびにディスクに書き込むことで、そのオブジェクトを永続的に保存したいと考えています。
多くの人がそうしないでくださいと言うかもしれません。時間がかかりすぎます。それは良い習慣ではありません、など。はい、私はそれを認識しています。これはむしろ「どうなるか」です。質問。
そのため、シングルトン オブジェクトを変更するときはいつでも、変更コードを@synchronized
ブロック内に配置してから、オブジェクトをディスクに書き込みます。私が考えていたdispatch_async
のは、次のように別のスレッドでオブジェクトの書き込みを行うために使用することでした:
//singleton object
id dataStructure;
@synchronized(lockObject)
{
//code that modifies singleton object
//not important
//sharedFileQueue is a SERIAL queue
dispatch_async([self sharedFileQueue], ^(void){
NSError * err;
NSData * plist = [NSPropertyListSerialization dataWithPropertyList:dataStructure
format:NSPropertyListBinaryFormat_v1_0
options:0 error:&err];
//url to somewhere
NSURL * url;
BOOL success = [plist writeToURL:url atomically:YES];
});
}
@synchronized
そのため、一度にそのコード ブロックを実行できるスレッドは 1 つだけであると理解しています。私の理解dispatch_async
は少し曖昧ですが、これはブロックをディスパッチキューに送信して非同期に実行し、すぐに戻ると思います。これは、ブロックがまだディスクに書き込まれている@synchronized
間に別のスレッドがブロックを通過した場合、別のブロックを送信して実行し、新しく変更されたものをディスクに書き込むだけですが、最初のブロックがディスクに書き込まれるまで開始されないことを意味します。dataStructure
dataStructure
dataStructure
私はこれについて正しく考えていますか?また、設定はアトミックに変更されますYES
か、NO
またはディスパッチキューのシリアル化により、複数のスレッドがこのファイルに同時に書き込まれないことが保証されますか?
ありがとうございました!