如何从dispatch_sync块中传递var?

时间:2014-08-28 21:50:28

标签: objective-c thread-safety dispatch

我需要从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()期间返回?

1 个答案:

答案 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