Objective c 如何从dispatch_sync块中传递var?

Objective c 如何从dispatch_sync块中传递var?,objective-c,thread-safety,dispatch,Objective C,Thread Safety,Dispatch,我需要从dispatch_sync()的块中提取NSData项。 具体来说,由于编译器错误,我无法在中间块中执行“返回数据”: 将“NSData*(^)(void)”传递到的块指针类型不兼容 类型为'dispatch_block_t'的参数(也称为'void(^)(void)') 错误发生在以下位置: 如果(数据)返回数据;//数据存在于内存缓存中 …我应该在块上放置返回类型vs(void)吗?还是需要重新设计? 一种解决方案是用@synchronized()替换调度 问题:是否可以在调度同步

我需要从dispatch_sync()的块中提取NSData项。

具体来说,由于编译器错误,我无法在中间块中执行“返回数据”:

将“NSData*(^)(void)”传递到的块指针类型不兼容 类型为'dispatch_block_t'的参数(也称为'void(^)(void)')

错误发生在以下位置:

如果(数据)返回数据;//数据存在于内存缓存中

…我应该在块上放置返回类型vs(void)吗?还是需要重新设计? 一种解决方案是用@synchronized()替换调度


问题:是否可以在调度同步()过程中中断块并返回?

问问自己返回值会去哪里。您没有
=dispatch\u sync(…)
,因此您不希望得到结果,因为
dispatch\u sync
不会返回结果

dispatch\u sync
获取返回类型为
void
的块-您的块不能返回返回类型为
的值。但是,块可以分配给具有
\uu块
属性的捕获局部变量-就像
数据
变量那样,并且您可以分配给块内的局部变量。您不需要分配给
数据
并返回它,这似乎就是您要做的

猜猜你想要的是:

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
        }
    }
});

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
        }
    }
});