Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 单线程安全设置器_Ios_Objective C_Ios7 - Fatal编程技术网

Ios 单线程安全设置器

Ios 单线程安全设置器,ios,objective-c,ios7,Ios,Objective C,Ios7,我有一个singleton类,我通过执行以下操作来确保它是一个singleton类 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ 如前所述。现在我需要添加一个 NSMutableDictionary *selections 属性,应用程序的其他部分肯定会更新(添加、读取键/值对)。 所以我的问题是如何确保这个属性是线程安全的? 宣布它是原子的? 我需要使它的setters和getter线程安全!。 我是一

我有一个singleton类,我通过执行以下操作来确保它是一个singleton类

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
如前所述。现在我需要添加一个

NSMutableDictionary *selections
属性,应用程序的其他部分肯定会更新(添加、读取键/值对)。 所以我的问题是如何确保这个属性是线程安全的? 宣布它是原子的? 我需要使它的setters和getter线程安全!。 我是一名来自C#/Java背景的objective C程序员,这就是为什么我对这个问题有点困惑的原因


谢谢

线程安全和异常安全的方法是使用
@synchronized
执行锁定

@property (readonly) NSMutableDictionary *selections;

- (void)withSelection:(void (^)(NSMutableDictionary *))callback {
    if (!callback) return;
    @synchronized(self.selection) { // you need to make sure self.selection isn't nil
        callback(self.selection);
    }
}


您还可以将GCD与dispatch_queue一起使用,以序列化选择操作

__block NSDictionary *copiedSelection;

[[Singleton singleton] withSelection:^(NSMutableDictionary *selection) {
    // you can modify selection safely here
    copiedSelection= [selection copy];
}];

// you can use copiedSelection here