2

問題は、私が megnto 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 = "indies.tester@gmail.com";
        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 = "indies.tester@gmail.com";
        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 = "indies.tester@gmail.com";
        message = 6tyrtyryrty;
        name = "Kaitlyn Matheson";
        "phone_no" = 564564;
        "product_name" = Ottoman;
        "product_options" = "";
        "update_time" = "0000-00-00 00:00:00";
    },

startSession は実際にレコードを表示しています NSLOG は call do response の前に出力されます。この問題を解決する方法.s

4

3 に答える 3

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配列を使用してテーブルをロードする

于 2013-05-03T13:09:02.627 に答える
1

最初に NSMutableArray を割り当て、[Magento.service renewSession] が実際に配列を返すことを確認します。

NSMutableArray *list = [NSMutableArray array];
list=[Magento.service renewSession];
//[Magento.service getCallForPriceData];
NSLog(@"Record is:%@",list);
于 2013-05-03T13:10:37.610 に答える
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);
}];

これは、最初のオブジェクトをリストに入れ、それを返すだけです(実際に何かを返すことを示すためだけです)。非同期でダウンロードされたアイテムもカウントするロジックを定義する必要があります。

于 2013-05-03T14:11:53.497 に答える