dispatch_async中的自定义块

时间:2012-09-27 13:26:58

标签: iphone ios cocoa-touch cocoa

此代码有效

[[MyManager sharedManager] makeRequestAndParsingfor:someParameters 
                                            success:^(NSDictionary * dictionary){
                                                // Sucessful response
                                                NSLog(@"Success!!");
                                            } 
                                            failure:^(NSError* error){ 
                                                // Error response
                                                NSLog(@"Failure!");    
                                            }];

但是每当我在后台运行它时,它就永远不会进入成功或失败状态。

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    [[MyManager sharedManager] makeRequestAndParsingfor:someParameters 
                                                success:^(NSDictionary * dictionary){
                                                    // Sucessful response
                                                    NSLog(@"Success!!");
                                                } 
                                                failure:^(NSError* error){ 
                                                    // Error response
                                                    NSLog(@"Failure!");    
                                                }];
}];

有人可以解释一下会发生什么吗?方法 makeRequestAndParsingfor :发出异步请求(再次使用块),然后解析结果。我的调试器显示它在第二种情况下永远不会成功。在第一种情况下,它就像一个魅力。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你的方法'makeRequestAndParsingfor'是否使用了args的block_copy(),并将返回值存储在一个强变量中(以获取堆中的块)?还要添加asserts(),这样你就可以验证你在'makeRequestAndParsingfor'中获得了两个块,甚至在调用其中一个之前重新测试。 [在过去使用block_copy()是必要的,但现在不是100%肯定。]

请注意,在第二种情况下,'makeRequestAndParsingfor'在并发队列中运行,其中多个可以同时调用块 - 不确定您的成功/失败块的作用,但最好是线程安全的,或者您应该运行'makeRequestAndParsingfor'中主要队列上的块(我在类似构建的应用程序中执行此操作)。