首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用与同步操作同步的@同步

使用与同步操作同步的@同步
EN

Stack Overflow用户
提问于 2016-03-25 17:59:50
回答 1查看 65关注 0票数 0

我使用的是一个UIDocument子类,它具有从多个线程调用其saveToURL方法的潜力。因此,我将它封装在一个包装器函数中,希望使线程安全:

代码语言:javascript
复制
- (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的线程?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-25 18:07:57

我刚才想到的一个可能的解决方案是向我的UIDocument子类添加一个属性,以指示是否正在进行保存操作,如果正在进行,则等待,然后再试一次。在@synchronize中包装此属性的检查和设置应防止两个线程同时将值读取为false,并相信它们可以保存文档:

代码语言:javascript
复制
- (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;
    }];
}

我不知道这是否足够或被认为是好的多线程实践。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36225284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档