Objective c 如果方法已在串行队列中执行,是否需要使用锁?
我的库中公开了2个方法调用,如下所示:Objective c 如果方法已在串行队列中执行,是否需要使用锁?,objective-c,locking,ipc,grand-central-dispatch,dispatch-async,Objective C,Locking,Ipc,Grand Central Dispatch,Dispatch Async,我的库中公开了2个方法调用,如下所示: -(void) createFile { dispatch_async(serialQueue, ^{ [fileObj createFile:fileInfo completion:^(void){ //completion block C1 }]; }); } -(void) readFile:(NSUInteger)timeStamp { dispatch_async(s
-(void) createFile {
dispatch_async(serialQueue, ^{
[fileObj createFile:fileInfo completion:^(void){
//completion block C1
}];
});
}
-(void) readFile:(NSUInteger)timeStamp {
dispatch_async(serialQueue, ^{
[fileObj readFile:timeStamp completion:^(void){
//completion block C2
}];
});
}
现在,createFile:fileInfo:completion
和readFile:timeStamp:completion
依次是XPC调用,它们调用进程P1
。它们在流程P1中的实现如下所示:
@interface FileObject : NSObject
+ (instancetype) sharedInstance;
@property (nonatomic, strong) NSData *fileContents;
@end
@implementation FileObject
+ (instancetype)sharedInstance
{
static FileObject *sharedObj = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedObj = [[self alloc] init];
});
return sharedObj;
}
- (void)createFile:(FileInfo *)fileInfo
completion:(void (^))completion {
FileObject *f = [FileObject sharedInstance];
//lock?
f.fileContents = //call some method;
//unlock
}
- (void)readFile:(NSUInteger)timeStamp
completion:(void (^))completion {
FileObject *f = [FileObject sharedInstance];
//do stuff with f.fileContents
}
@end
需要注意的是,对方法createFile
的调用能够修改单例obj,并且readFile:fileInfo
总是在createFile
之后调用(调用时使用串行队列)
我的问题是我的库中公开的两种方法的串行队列用法
readFileInfo:FileInfo:completion
中修改f.fileContents
时,是否仍需要锁定和解锁李>
P1
会自动处理这个问题吗,还是我应该对此做些什么- 完全丢失调度队列并使用完成处理程序模式(这是更好的解决方案,但您说您不能更改端点,这显然排除了这种更符合逻辑的方法);或
- 使
和createFile
行为同步(例如,使用信号量),然后您就可以利用GCD队列行为(我们通常避免锁、信号量或任何将“等待”的模式,但考虑到您在后台队列上执行此操作,问题较少)readFile
createFile
和readFile
创建自定义、异步、NSOperation
子类。这是一种比GCD中的锁或信号量强得多的模式,因为它将死锁风险降至最低FileObject
设置为单例。每个FileObject
都与一个特定的文件相关联,它不必成为一个单独的文件。这一点尤其重要,因为我们发现离线时您正在考虑这是一个包含多个请求的XPC服务,而单例模式与此相反
另外,顺便说一句,FileObject
不符合使用单例的基本标准。关于单例的考虑因素的讨论(我们不需要在这里重复,特别是因为它与您的主要问题无关),请参见单例有其位置,但这是一个您可能需要单独实例的场景,因此单例模式似乎特别不适合