2012-11-07 59 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