【问题标题】:Calling a web service Asynchronously in ios在 ios 中异步调用 Web 服务
【发布时间】:2014-08-26 11:48:53
【问题描述】:
    NSData *responseData2= [NSURLConnection sendSynchronousRequest:request2 returningResponse:&urlResponse2 error:&error2];
    aparser =[[NSXMLParser alloc]initWithData:responseData2];

到目前为止,我正在调用服务并完全在数组中获取数据,然后在 tableview 中加载。但是当有大量数据时,它需要很长时间才能运行,所以我如何异步调用服务并加载 tableview一次。

我想使用示例以获得更好的理解。就像遵循 Xml 响应一样,如果它有 1000 个学生要解析,那么我想获取第一个学生详细信息并将其加载到 tableview 和第二个学生详细信息并加载到 Tableview...。等等..

  <Class>
            <Student>
            <Name>Rama</Name>
            <Rollno>01</Rollno>
            </Student>
            <Student>
            <Name>Ravi</Name>
            <Rollno>02</Rollno>
            </Student>
         ......
         ......
  </Class>

提前致谢。

【问题讨论】:

    标签: ios web-services tableview


    【解决方案1】:

    像这样

    NSOperationQueue *mainQueue = [[NSOperationQueue alloc] init];
    [mainQueue setMaxConcurrentOperationCount:5];
    
    NSURL *url = [NSURL URLWithString:@"http://192.168.0.63:7070/api/Misc/GetFuelTypes"];
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    
    [request setHTTPMethod:@"GET"];
    [request setAllHTTPHeaderFields:@{@"Accepts-Encoding": @"gzip", @"Accept": @"application/json"}];
    
    [NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
        NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response;
        if (!error) {
            NSLog(@"Status Code: %li %@", (long)urlResponse.statusCode, [NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]);
            NSLog(@"Response Body: %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
    }
    else {
        NSLog(@"An error occured, Status Code: %i", urlResponse.statusCode);
        NSLog(@"Description: %@", [error localizedDescription]);
        NSLog(@"Response Body: %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
        }
    }];
    

    【讨论】:

    • 感谢您对 xml 响应的响应是否相同,以及如何异步加载 tableview..
    • @siva 它是 sendAsynchronousRequest 而不是 sendSynchronous 请求,您在处理程序中执行表格内容,当接收到数据时会调用该处理程序
    • 这里完成句柄在加载总数据后被调用,但我想在 Tableview 和第二个学生等中获取第一个标准表视图和加载,但在这里我一次总共得到 1000 个学生详细信息和并且在这方面也花费了太多时间。
    • 可能是我认为不可能的事情?不是吗?还有 [mainQueue setMaxConcurrentOperationCount:5];这个有什么用
    【解决方案2】:

    在获取任何数据之前,显示一条消息或加载指示器。这是一个不错的SO post 说明如何操作。

    每当您获取数据时,请在您的 tableview 上调用 reloadData,它会根据委托方法 numberOfRowsInSectioncellForRowAtIndexPath 等重新构建自己。

    【讨论】:

      【解决方案3】:
      -(void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib.
      
          app=[UIApplication sharedApplication].delegate;
      
          xmldata=[[NSMutableData alloc]init];
          dict=[[NSDictionary alloc]init];
          mArray=[[NSMutableArray alloc]init];
          NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://indianbloodbank.com/api/donors/?bloodgroup=O%2B"]];
          NSURLConnection *Co=[NSURLConnection connectionWithRequest:request delegate:self];
          NSLog(@"Connection-%@",Co);
      }
      
      -(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response{return request;} -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"NETWORK ERROR"); }
      
      -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"%@",response); } -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {[xmldata appendData:data]; NSLog(@"XMLData-%@",xmldata); } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { dict=[XMLReader dictionaryForXMLData:xmldata error:nil]; NSLog(@"Dictionary-%@",dict); mArray=[dict retrieveForPath:@"response.donorslist.donors"]; NSLog(@"MutableArray-%@",mArray);
      
      //DONORS ENTITY
      
          //Saving the data in to database
          for (int i=0; i<mArray.count; i++)
          {
              Database * don=[NSEntityDescription insertNewObjectForEntityForName:@"Donors" inManagedObjectContext:app.managedObjectContext];
      
              don.donid=[[mArray objectAtIndex:i]valueForKey:@"id"];
              don.gender=[[mArray objectAtIndex:i]valueForKey:@"gender"];
              don.name=[[mArray objectAtIndex:i]valueForKey:@"name"];
              don.location=[[mArray objectAtIndex:i]valueForKey:@"location"];
              don.phone=[[mArray objectAtIndex:i]valueForKey:@"phone"];
      
              [app saveContext];
      
              NSLog(@"Donors Entity Details-%@,%@,%@,%@,%@",[[mArray objectAtIndex:i]valueForKey:@"id"],[[mArray objectAtIndex:i]valueForKey:@"gender"],[[mArray objectAtIndex:i]valueForKey:@"name"],[[mArray objectAtIndex:i]valueForKey:@"location"],[[mArray objectAtIndex:i]valueForKey:@"phone"]);
      
              [tbl reloadData];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 2011-09-03
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        相关资源
        最近更新 更多