2016-05-25 6 views
0

Ich habe eine Singleton-Klasse, in der ich eine Methode zum Parsen von Json-Daten über URL implementiert habe. Der Code ist wie untenWie man Json-Daten mit der Singleton-Klasse analysiert

-(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; 
} 

Verfahren keine Werte zurückgibt, ist es, weil die Blöcke Zeit auszuführen nimmt innerhalb dieses Verfahrens das Ergebnis zurückgibt. Also gibt es eine Möglichkeit zu warten, bis Block abgeschlossen ist und den Wert zurückgibt.

+0

Verwenden Sie einen Abschlussblock, Benachrichtigungen oder Delegate. Aber da es async ist, enthält 'grrrrr' keinen Wert bei der Rückgabe. – Larme

+0

So verwenden Sie den Abschlussblock in meinem Code. Ist es möglich? –

Antwort

0

Ragul ml,

Simplest Lösung I vorschlagen können Blöcke verwenden :)

Hier ist, wie Sie es :) -(id)parseJsonDataWIthURL:(NSString *)url :(NSString*)datumm ändern erreichen können,

-(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]; 
} 

schließlich Ihren Anruf ändern wie,

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

Vielen Dank Sandeep, es hat für mich funktioniert. Ist withCompletionBlock ein benutzerdefinierter Block? –

+0

yeah :) Sie haben es in Methode defination erklärt :) Dies ist die Blockdefinition (void (^) (NSMutableArray *)) was bedeutet, dass dieser Block NSMutableArray als Argument nimmt nichts zurück :) '^' zeigt an, dass es ein ist Block :) –