【发布时间】:2014-08-28 21:50:27
【问题描述】:
我需要从 dispatch_sync() 的块中提取 NSData 项。
具体来说,由于编译器错误,我无法在中间块中执行“返回数据”:
不兼容的块指针类型将 'NSData *(^)(void)' 传递给 “dispatch_block_t”类型的参数(又名“void (^)(void)”)
错误发生在这里:
如果(数据)返回数据; // 数据存在于内存缓存中
- (NSData *)dataForFile:(NSString *)fileName {
__block NSData *data;
// ... having problem with 'data' var within dispatch_sync
dispatch_sync(serialQueue, ^{
data = [_memoryCache objectForKey:fileName];
if (data)return data; // data is present in memory cache
NSString *archivePath = [_cacheDirectory stringByAppendingPathComponent:fileName];
data = [NSData dataWithContentsOfFile:archivePath];
if (data) {
[self cacheData:data toFile:fileName]; // put the recently accessed data to memory cache
}
});
return data;
}
...我应该将返回类型与 (void) 放在块上吗?还是需要重新设计? 一种解决方案是用 @synchronized() 替换调度。
问题:是否可以在 dispatch_sync() 期间突破块并返回?
【问题讨论】:
标签: objective-c thread-safety dispatch