繁体   English   中英

dispatch_async内部的自定义块

[英]Custom block inside dispatch_async

此代码有效

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM