亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

塊內函數的返回值

塊內函數的返回值

iOS
江戶川亂折騰 2019-09-26 11:21:42
塊內函數的返回值我正在使用AFNetworking從服務器獲取數據:-(NSArray)some function {     AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request         success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {             NSArray *jsonArray =[JSON valueForKey:@"posts"];         }         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}}所以我在這里想要做的就是將jsonArray返回給函數。顯然退貨是行不通的。
查看完整描述

3 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

您不能使用完成塊為您的方法創建返回值。在AFJSONRequestOperation異步執行其工作。someFunction在操作仍在進行時將返回。成功和失敗模塊是您在需要的地方獲得結果值的方式。

這里的一種選擇是將調用者作為參數傳遞給包裝方法,以便完成功能塊可以傳遞數組。

- (void)goFetch:(id)caller{
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
    success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

        [caller takeThisArrayAndShoveIt:[JSON valueForKey:@"posts"]];
    }
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}}

您還可以使調用者創建并傳遞一個成功運行的阻止程序。然后,goFetch:不再需要知道調用者上存在哪些屬性。

- (void)goFetch:(void(^)(NSArray *))completion{
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
    success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        if( completion ) completion([JSON valueForKey:@"posts"]);
    }
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}}


查看完整回答
反對 回復 2019-09-26
?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

正如其他人所說,在處理異步調用時您不能這樣做。除了返回期望的數組,還可以傳遞一個完成塊作為參數

typedef void (^Completion)(NSArray* array, NSError *error);-(void)someFunctionWithBlock:(Completion)block {
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
        success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            NSArray *jsonArray =[JSON valueForKey:@"posts"];
            if (block) block(jsonArray, nil);
        }
        failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
            if (block) block(nil, error); 
        }}

然后在其中調用someFunction。此代碼還將為您執行正確的錯誤處理。

[yourClassInstance someFunctionWithBlock:^(NSArray* array, NSError *error) {
   if (error) {
      NSLog(%@"Oops error: %@",error.localizedDescription);
   } else {
      //do what you want with the returned array here.
   }}];


查看完整回答
反對 回復 2019-09-26
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

我遇到了此類問題,并通過以下方法解決了。我看到了以上使用塊的答案。但是此解決方案當時更適合。該方法的邏輯很簡單。您需要將對象及其方法作為參數發送,請求完成后將調用該方法。希望能幫助到你。

+(void)request:(NSString *)link parameters:(NSDictionary *)params  forInstance:(id)instance returns:(SEL)returnValue{
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:link
      parameters:params
         success:^(AFHTTPRequestOperation *operation, id responseObject)
     {
         [instance performSelector:returnValue withObject: responseObject];
     }
         failure:^(AFHTTPRequestOperation *operation, NSError *error)
     {
         [instance performSelector:returnValue withObject:nil];
         //NSLog(@"Error: %@", error);
     }];}


查看完整回答
反對 回復 2019-09-26
  • 3 回答
  • 0 關注
  • 450 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號