返回dispatch_async获取的变量

时间:2013-11-24 22:08:12

标签: ios objective-c multithreading objective-c-blocks

基本上:一个方法需要返回一个在dispatch_async中获取的NSDictionary。这就是我的尝试:

- (NSDictionary *)fetchNSDictionary {
    dispatch_queue_t Queue = dispatch_queue_create("Dictionary fetcher", NULL);
    dispatch_async(Queue, ^{
        NSDictionary *dict = ...
        dispatch_async(dispatch_get_main_queue(),^{
            return dict;
        )};
    )};
}

结果:

Incompatible block pointer types passing 'NSDictionary *(^)(void)' 
to parameter of type 'dispatch_block_t' (aka 'void (^)(void)')

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

当您说return dict;时,您实际上是在尝试将dict返回到调度块的调用者(运行后台异步的自动进程) - 这不起作用。

由于您使用的是异步方法,因此无法将块中收到的数据返回给您启动网络操作的方法。当调用该块中的代码时,系统会很长时间执行该方法。

您需要做的是设置一个委托系统 - 如果这是一个帮助类,您可以添加一个包含didFinishLoadingStuff:(NSDictionary *)stuff等方法的协议。

然后你会改变

 - (NSData *) fetchNSDictionary{...}

类似

- (void)getDictionaryWithDelegate:(NSObject<StuffGetterProtocol> *)delegate{...}

而不是return dict;,你会说:

[delegate didFinishLoadingStuff:dict];

当然,在您调用它的任何类中实现委托方法:

- (void)didFinishLoadingStuff:(NSDictionary *)stuff
{
    //do something with stuff
}