1

我在我的图书馆暴露2方法调用如下:如果方法已经在串行队列中执行,是否需要使用锁定?

-(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:completionreadFile:timeStamp:completion是在调用到进程P1转XPC电话。他们的进程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(串行队列之后方法createFile调用能够进行修改的单身OBJ和readFile:fileInfo总是叫在调用)。

我的问题,给出了在我的图书馆暴露了两个方法串行队列使用,

  1. 我还需要锁,当我在readFileInfo:FileInfo:completion修改f.fileContents解锁?
  2. 如果有多个不同的进程调用到我的库中,该怎么办? XPC将P1自动处理,还是需要我做点什么?

回答

2

你问:

我是否需要,如果方法在一个串行队列已经执行到使用锁?

如果您可以从多个线程同时与非线程安全对象进行交互,那么您可以使用锁定(或多种其他技术)来同步您的访问。但是,如果您正在通过串行队列完成所有交互操作,则不需要锁定。

但是你需要小心,因为虽然你使用了一个串行队列,但你有可以在不同线程上运行的完成处理程序。但是,如果您在这些完成处理程序上协调交互,以便任何人都不能同时运行(下面会详细介绍),则不需要锁定(或其他同步技术)。

一束根据您的代码片段(和对话,我们已经在别处有)其他的想法:

  1. 你还在使用异步方法GCD调度呼叫。那里有一种认知上的不和谐。无论是

    • 完全失去调度队列和使用完成处理模式(这是更好的解决方案恕我直言,但你说你不能改变你的终点,这显然排除了这种更符合逻辑的做法);或
    • 使createFilereadFile行为同步(例如信号量),然后您可以利用GCD队列行为(我们通常避免像锁,信号灯或任何“等待”的模式,但考虑到你'在背景排队上做这件事,这不是问题)。
  2. 如果你想这两个根本的异步任务的行为同步,你可以用锁做到这一点了,但是我觉得调度信号量多的逻辑模式,如果你要使用调度队列。

  3. 更好的模式将是使createFilereadFile创建自定义,异步,NSOperation子类。这比GCD中的锁或信号量强得多,因为它将死锁风险降至最低。

  4. 完全不相关的问题在这里,我不会建议使FileObject单身。每个FileObject都与一个特定的文件相关联,并且它没有业务单身。这一点尤其重要,因为我们在离线状态下发现,您正在考虑这是一个有多个请求的XPC服务,单例模式与此相反。

    另外,FileObject没有通过什么时候使用单例的基本标准。关于单身人士的考虑(我们不需要在这里重复,尤其是因为它与你的主要问题无关),请参阅What is so bad about singletons?单身人士也有自己的位置,但这是一种场景,你可能需要单独的实例,所以单身模式似乎特别不适合。

相关问题