2013-05-03 78 views
2

問題是我調用megnto api,但是當api在所有其他語句執行之前返回對象時。調用API之後不等待響應

NSMutableArray *list=[Magento.service startSession]; 

    NSLog(@"Record is:%@",list); 
,我已經修改了

startSession方法是:

- (NSMutableArray *)startSession 
{ 
NSString *_sessionID; 
    NSNumber *nsPage =[NSNumber numberWithInt:1]; 
    NSNumber *nsData =[NSNumber numberWithInt:10]; 
    NSMutableArray *listOfName = [[NSMutableArray alloc] init]; 
    NSArray *args = [NSArray arrayWithObjects:nsPage,nsData,nil ]; 
    @synchronized(self) { 
    _sessionID = sessionID; 
} 
if (_sessionID != FAILED_SESSION) 
    dispatch_group_enter(session_group); 
[client postPath:@"login" parameters:@{@"username": MAGENTO_USERNAME, @"apiKey": MAGENTO_API_KEY} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    sessionID = responseObject; 



    dispatch_group_leave(session_group); 

     [client postPath:@"call" parameters:@{@"sessionId":sessionID, @"resourcePath":@"callforprice_collection.getCallForPriceCollection", 
     @"args":args 
     } success:^(AFHTTPRequestOperation *operationData, id responseData) { 

      NSLog(@"Response : %@",responseData); 
      [listOfName addObject:[responseData valueForKey:@"name"]]; 

     } failure:^(AFHTTPRequestOperation *operationData, NSError *error) { 
      NSLog(@"Response is not get"); 
      sessionID = FAILED_SESSION; 
     }]; 


     NSLog(@"got session %@", sessionID); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    sessionID = FAILED_SESSION; 
}]; 
    return listOfName; 

} 

O/P是

2013-05-03 06:27:16.272 CallForPrice[3120:c07] Record is:() 
2013-05-03 06:27:19.836 CallForPrice[3120:c07] got session 88ef34087a12809334ae3a0c839f85b6 
** response that i have printed in method** 
2013-05-03 06:27:22.048 CallForPrice[3120:c07] Response : (
     { 
     "callforprice_id" = 13; 
     country = Austria; 
     "created_time" = "2013-05-03 12:03:05"; 
     emailid = "[email protected]"; 
     message = hfhftrfygjh; 
     name = "Richard Conover"; 
     "phone_no" = 8977896; 
     "product_name" = Ottoman; 
     "product_options" = ""; 
     "update_time" = "0000-00-00 00:00:00"; 
    }, 
     { 
     "callforprice_id" = 12; 
     country = "Antigua and Barbuda"; 
     "created_time" = "2013-05-03 12:01:24"; 
     emailid = "[email protected]"; 
     message = sdfsdfsdfwe; 
     name = "Richard Conover"; 
     "phone_no" = 5645; 
     "product_name" = Ottoman; 
     "product_options" = ""; 
     "update_time" = "0000-00-00 00:00:00"; 
    }, 
     { 
     "callforprice_id" = 11; 
     country = Angola; 
     "created_time" = "2013-05-03 11:58:51"; 
     emailid = "[email protected]"; 
     message = 6tyrtyryrty; 
     name = "Kaitlyn Matheson"; 
     "phone_no" = 564564; 
     "product_name" = Ottoman; 
     "product_options" = ""; 
     "update_time" = "0000-00-00 00:00:00"; 
    }, 

startSession實際顯示記錄什麼發生是的NSLog被調用之前做印刷迴應。如何解決這個problem.s

+0

因爲它是在不同線程上運行的renewSession – 2013-05-03 12:59:56

+1

爲什麼這條線被註釋掉了? – Undo 2013-05-03 13:00:00

回答

2

1)所有進口後,加入這一行Magento.h

typedef void(^completion)(NSArray *list); 

2)改變方法簽名,無論是在h和.M

- (void)startSession:(completion) completion 

3)Magento.m,修改方法與此

- (void)startSession:(completion) completion 
{ 

     NSString *_sessionID; 
     NSNumber *nsPage =[NSNumber numberWithInt:1]; 
     NSNumber *nsData =[NSNumber numberWithInt:10]; 
     NSMutableArray *listOfName = [[NSMutableArray alloc] init]; 
     NSArray *args = [NSArray arrayWithObjects:nsPage,nsData,nil ]; 
     @synchronized(self) { 
      _sessionID = sessionID; 
     } 
     if (_sessionID != FAILED_SESSION) 
      dispatch_group_enter(session_group); 
     [client postPath:@"login" parameters:@{@"username": MAGENTO_USERNAME, @"apiKey": MAGENTO_API_KEY} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      sessionID = responseObject; 



      dispatch_group_leave(session_group); 

      [client postPath:@"call" parameters:@{@"sessionId":sessionID, @"resourcePath":@"callforprice_collection.getCallForPriceCollection", 
      @"args":args 
      } success:^(AFHTTPRequestOperation *operationData, id responseData) { 

       NSLog(@"Response : %@",responseData); 
       [listOfName addObject:[responseData valueForKey:@"name"]]; 

       completion(listOfName); 

      } failure:^(AFHTTPRequestOperation *operationData, NSError *error) { 
       NSLog(@"Response is not get"); 
       sessionID = FAILED_SESSION; 
       completion(nil); 
      }]; 


      NSLog(@"got session %@", sessionID); 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      sessionID = FAILED_SESSION; 
      completion(nil); 
     }]; 

} 

4)在viewController.h,聲明一個全局變量保持返回的名稱,

@property(nonatomic, strong) NSArray *nameList; 

// and in viewDidLoad method, 
self.nameList = [[NSArray alloc] init]; 

5)把這個代碼片段,在viewDidLoad中或

[Magento.service startSession:^(NSArray *list) { 
    if(list){ 
     self.nameList = list; 
     [self.tableView reloadData]; 
    }else self.nameList = [[NSArray alloc] init]; 
}]; 

6)使用self.nameList陣列加載該表

+0

我有一個問題,我怎樣才能將參數傳遞給startSession方法 – UnderGround 2013-05-08 07:58:17

+1

哪種類型的參數是我的朋友?如果它是一個字符串,你可以使用這種方法, - (void)startSession:(完成)完成withString:(NSString *)inputString – 2013-05-08 08:12:03

+1

謝謝親愛的!我雖然使用完成塊後,我們無法傳遞任何其他參數,所以我很傻。感謝您快速重播。並感謝你我即將完成我的申請。 – UnderGround 2013-05-08 08:16:17

1

的Alloc所述的NSMutableArray第一和確保[Magento的.service renewSession]實際返回一個數組。

NSMutableArray *list = [NSMutableArray array]; 
list=[Magento.service renewSession]; 
//[Magento.service getCallForPriceData]; 
NSLog(@"Record is:%@",list); 
+0

問題不是這樣,但我調用不同的方法,而不是我已修改,但仍然給出的響應爲零並且結果爲 – UnderGround 2013-05-03 13:35:21

+0

在renewSession方法上放置一個斷點,並確保它實際上是首先創建數組。你說你修改了這個方法來返回一個數組,所以這個問題的可能性更大。 – 2013-05-03 13:39:00

0

我不知道Magneto API,但我遇到過這種行爲。這是一種異步方法。在startSession中,它將返回空列表,並進行異步調用(在不同的線程上)。而在迴應中,你對結果無能爲力。 (塊存儲本地引用,這就是爲什麼你可以添加一些東西)。試圖定義一個

startSessionWithCompletionBlock:(void(^)(NSArray* list))completionBlock; 

功能和變化的響應處理程序:

NSLog(@"Response : %@",responseData); 
[listOfName addObject:[responseData valueForKey:@"name"]]; 
completionBlock(listOfName); 

,並呼籲

[Magento.service startSessionWithCompletionBlock:^(NSArray* list){ 
    NSLog(@"Record is:%@",list); 
}]; 

這樣只會把第一個對象列表中,並使其返回(只是以顯示它實際返回的東西)。您需要定義一些邏輯來計算異步下載項目。