2016-05-25 19 views
0

シングルトンクラスを使用して、URLを介してjsonデータを解析するメソッドを実装しました。コードは次のとおりですシングルトンクラスを使用してjsonデータを解析する方法

-(id)parseJsonDataWIthURL:(NSString *)url :(NSString*)datumm 
{ 

    NSMutableDictionary *arrrrr=[[NSMutableDictionary alloc]init]; 



      NSMutableURLRequest *reqqq=[[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:url]]; 

      NSData *dataaa=[datumm dataUsingEncoding:NSUTF8StringEncoding]; 
      [reqqq setHTTPMethod:@"POST"]; 
      [reqqq setHTTPBody:dataaa]; 

      NSURLSessionConfiguration *configg=[NSURLSessionConfiguration defaultSessionConfiguration]; 
      NSURLSession*sessionn=[NSURLSession sessionWithConfiguration:configg delegate:nil delegateQueue:[NSOperationQueue mainQueue]]; 

      NSURLSessionDataTask *taskk=[sessionn dataTaskWithRequest:reqqq completionHandler:^(NSData *data,NSURLResponse *responce,NSError *error){ 
       if(error) 
       { 
        NSLog(@"%@", [error localizedDescription]); 
       }else{ 
        NSMutableDictionary *d = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments|NSJSONReadingMutableContainers error:&error]; 
        NSLog(@"data %@",d); 
        [arrrrr setDictionary:d]; 
       } 
      }]; 
      [taskk resume]; 


    return arrrrr; 
} 

このメソッドは値が返されません。ブロック内で実行するには時間がかかるため、メソッドは結果を返します。したがって、ブロックが完了して値を返すまで待つ方法があります。

+0

完了ブロック、通知またはデリゲートを使用します。しかし、非同期なので、 'grrrrr'は返り値を含みません。 – Larme

+0

私のコードで補完ブロックを使用する方法。出来ますか? –

答えて

0

ragul mlで、私が提案できる

最も簡単な解決策は、ブロックを使用することです:)

ここでは、あなたはそれが最終的にあなたの呼び出しを変更-(id)parseJsonDataWIthURL:(NSString *)url :(NSString*)datumm

-(void)parseJsonDataWIthURL:(NSString *)url :(NSString*)datumm withCompletionBlock:(void(^)(NSMutableArray *))completionBlock 
{ 

    NSMutableDictionary *arrrrr=[[NSMutableDictionary alloc]init]; 



      NSMutableURLRequest *reqqq=[[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:url]]; 

      NSData *dataaa=[datumm dataUsingEncoding:NSUTF8StringEncoding]; 
      [reqqq setHTTPMethod:@"POST"]; 
      [reqqq setHTTPBody:dataaa]; 

      NSURLSessionConfiguration *configg=[NSURLSessionConfiguration defaultSessionConfiguration]; 
      NSURLSession*sessionn=[NSURLSession sessionWithConfiguration:configg delegate:nil delegateQueue:[NSOperationQueue mainQueue]]; 

      NSURLSessionDataTask *taskk=[sessionn dataTaskWithRequest:reqqq completionHandler:^(NSData *data,NSURLResponse *responce,NSError *error){ 
       if(error) 
       { 
        NSLog(@"%@", [error localizedDescription]); 
        completionBlock(nil) 
       }else{ 
        NSMutableDictionary *d = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments|NSJSONReadingMutableContainers error:&error]; 
        NSLog(@"data %@",d); 
        [arrrrr setDictionary:d]; 
        if (completionBlock) { 
          completionBlock(arrrrr); 
        } 
       } 
      }]; 
      [taskk resume]; 
} 

を変更:)達成できる方法でありますas、

[[YourSingletonClass sharedInstance] parseJsonDataWIthURL:your_url :datumm withCompletionBlock:^(NSMutableArray *array) { 
     if (array){ 
      //web service is successful 
     } 
    }]; 
+0

ありがとうございます、それは私のために働いた。 withCompletionBlockはカスタムブロックですか? –

+0

yeah :)これはメソッドdefinationで宣言しています:)これはブロックdefination(void(^)(NSMutableArray *))です。つまり、NSMutableArrayはNSMutableArrayを引数として受け取りません。ブロック:) –

関連する問題