我需要从dispatch_sync()的块中提取NSData项
具体来说,我无法返回数据'由于编译器错误导致中间块:
不兼容的块指针类型传递&#NS; NSData *(^)(void)'至 参数类型' dispatch_block_t' (又名' void(^)(void)')
此处发生错误:
if(data)返回数据; //数据存在于内存缓存中
- (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;
}
...我应该在块上放置一个返回类型vs(void)吗?还是需要重新设计? 一种解决方案是使用@synchronized()替换分派。
问题:是否有可能突破障碍&在dispatch_sync()期间返回?
答案 0 :(得分:2)
问问自己返回值的去向。你没有<var> = dispatch_sync(...)
,所以你不会期待一个结果,这是好的,因为dispatch_sync
没有回复!
dispatch_sync
使用返回类型为void
的块 - 您的块无法返回return
的值。但是,块可以分配给具有__block
属性的捕获的局部变量 - 就像您的data
变量一样,并且您确定分配给块内的变量。您不需要分配到data
和返回它,这似乎就是您要做的事情。
猜猜你想要的是:
dispatch_sync(serialQueue, ^{
data = [_memoryCache objectForKey:fileName];
if (!data) // data is NOT 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
}
}
});
HTH