【问题标题】:How do I pass a var from within a dispatch_sync block?如何从 dispatch_sync 块中传递 var?
【发布时间】: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


    【解决方案1】:

    问问自己返回值会去哪里。你没有<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

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2020-05-03
      相关资源
      最近更新 更多