我使用的是一个UIDocument子类,它具有从多个线程调用其saveToURL方法的潜力。因此,我将它封装在一个包装器函数中,希望使线程安全:
- (void)saveWithCompletionBlock:(void(^)(TransactionDocumentReturnCode status))completion {
@synchronized (self) {
[self saveToURL:[self fileURL] forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success){
// Generate returncode depending on outcome of save operation
completion(returncode);
}];
}
}我假设对[self saveToURL:...]的调用将立即返回,因为保存操作本身发生在后台线程上,可能导致在保存操作完成之前释放锁。那么,在调用saveWithCompletionBlock:的完成块之前,是否有任何方法阻止其他调用saveToURL的线程?
发布于 2016-03-25 18:07:57
我刚才想到的一个可能的解决方案是向我的UIDocument子类添加一个属性,以指示是否正在进行保存操作,如果正在进行,则等待,然后再试一次。在@synchronize中包装此属性的检查和设置应防止两个线程同时将值读取为false,并相信它们可以保存文档:
- (void)saveWithCompletionBlock:(void(^)(TransactionDocumentReturnCode status))completion {
@synchronized(self){
if (self.isSaving) {
[self performSelector:@selector(saveWithCompletionBlock:) withObject:completion afterDelay:1.0];
return;
}
self.isSaving = YES;
}
[self saveToURL:[self fileURL] forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success){
// Generate returncode depending on outcome of save operation
completion(returncode);
self.isSaving = NO;
}];
}我不知道这是否足够或被认为是好的多线程实践。
https://stackoverflow.com/questions/36225284
复制相似问题