2012-11-07 60 views
1

下面我有一些代码应当返回一个数组,来自服务器的响应发生在一个块内:从返回一个变量的块

- (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的建议。任何帮助,将不胜感激。

+1

你知道该块被执行,并在其中方法'getArray'早已结束,走了一段时间最有可能完成?除非你实际使用的是引用返回(你通常不应该) – Till

+0

不要将其命名以'GET'前缀的方法。 – bbum

回答

1

这里更换回我想创建在某个类的方法让我们说- (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:法阵。

+0

干杯,工作就像一个魅力 –

+0

为什么'copy'? – bbum

+0

@bbum其实,我忘了在'的NSMutableArray * res'的前面加上一个'__weak'。但是,如果甚至有必要,那么再次不太确定。说实话,我在'ARC'下有一些关于块和内存管理的技术。 Afaik块保留了数组,直到块被交易,但我不确定它是否将所有权正确地传递给了'arrayFetched:'方法。 – Tobi

3

块的PARAM传递给函数

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

然后用block(res);

+1

伟大的答案+1你 – edzio27