【问题标题】:Return a variable from inside a block从块内返回一个变量
【发布时间】:2012-11-07 18:47:25
【问题描述】:

下面我有一些代码应该返回一个数组,来自服务器的响应发生在一个块中:

- (NSMutableArray *)getArray
{
    NSMutableDictionary* params =[NSMutableDictionary dictionaryWithObjectsAndKeys:
                                  @"pending", @"command",
                                  @"2" , @"userID",
                                  nil];

    [[API sharedInstance] commandWithParams:params
                               onCompletion:^(NSDictionary *json) {
                                   //result returned


                                   if ([json objectForKey:@"error"]==nil) {
                                       NSMutableArray *res = [[NSMutableArray alloc] init];
                                       [res addObject:@"1234"];

                                       RETURN HERE

                                   } else {
                                       //error
                                       [UIAlertView title:@"Error" withMessage:[json objectForKey:@"error"]];
                                   }

                               }];
}

解析数据并创建数组后,我想返回为getArray 方法调用创建的数组。到目前为止,经过几个小时的尝试,我没有任何运气,即使尝试了之前关于 stackoverflow 问题的一些建议。任何帮助将不胜感激。

【问题讨论】:

  • 您是否知道该块已被执行并且很可能在方法 getArray 早已完成并消失的时候完成?
  • 不要使用get 前缀命名方法,除非您实际使用按引用返回(通常不应该这样做)。

标签: iphone objective-c asynchronous nsarray objective-c-blocks


【解决方案1】:

将块作为参数传递给函数

- (NSMutableArray *)getArray:(void (^)(NSArray *))block {}

然后将 RETURN HERE 替换为 block(res);

【讨论】:

    【解决方案2】:

    我会在类的某个地方创建一个方法,比如说- (void)arrayFetched:(NSArray *)fetchedArray

    然后你像这样修改你的代码:

    //...
    if ([json objectForKey:@"error"]==nil) {
        __weak NSMutableArray *res = [[NSMutableArray alloc] init];
        [res addObject:@"1234"];
    
        dispatch_async(dispatch_get_main_queue(), ^{
            [self arrayFetched:[res copy]];
        });
        //...
    

    然后在arrayFetched: 方法中使用你想要的数组。

    【讨论】:

    • @bbum 实际上,我忘了在NSMutableArray *res 前面添加__weak。但话又说回来不太确定,如果这甚至是必要的。老实说,我在ARC 下对块和内存管理做了一些补充。 Afaik 块保留数组,直到块被释放,但我不确定它是否正确地将所有权传递给 arrayFetched: 方法。
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2014-12-22
    • 2013-05-06
    相关资源
    最近更新 更多