2

此代码有效

[[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方法:发出异步请求(再次使用块),然后解析结果。我的调试器显示在第二种情况下它永远不会获得自己的成功/失败。在第一种情况下,它就像一个魅力。有任何想法吗?

4

1 回答 1

1

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

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

于 2012-09-27T13:39:29.613 回答