how to set textfiled value by getting data from server
i am getting xml data from server but unable set those values to textfield.can u please correct me if there is any thing with code below
Customerdetails.h(model)
@interface Customerdetails : NSObject
@property(nonatomic,strong)NSString*fst;
@property(nonatomic,strong)NSString*lst;
@property(nonatomic,strong)NSString*street;
@property(nonatomic,strong)NSString*city;
@end
detailviewcontroller.m
#import "DetailViewController.h"
#import "Customerdetails.h"
@interface DetailViewController ()<NSXMLParserDelegate>
@property(nonatomic,strong)NSXMLParser*xmlparse;
@property(nonatomic,strong)NSMutableString*tempstr;
@property(nonatomic,strong)NSMutableString*foundvalue;
@property Customerdetails*csd;
@end
@implementation DetailViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_csd=[[Customerdetails alloc]init];
NSMutableURLRequest*req=[[NSMutableURLRequest alloc]init];
_tempstr=[[NSMutableString alloc]init];
NSURL*url=[NSURL URLWithString:@"http://www.thomas-bayer.com/sqlrest/CUSTOMER/4"];
[req setURL:url];
[[[NSURLSession sharedSession]dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// SMXMLDocument *document = [SMXMLDocument documentWithData:data error:&error];
NSString*str=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
_xmlparse=[[NSXMLParser alloc]initWithData:data];
_xmlparse.delegate=self;
[_xmlparse parse];
}] resume];
dispatch_async(dispatch_get_main_queue(), ^{
self.first.text=[self.csd fst];
self.last.text=[self.csd lst];
self.street.text=[self.csd street];
self.city.text=[self.csd city];
});
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict;{
_tempstr=[[NSMutableString alloc]initWithString:elementName];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName;{
// sent when an end tag is encountered. The various parameters are supplied as above.
if([self.tempstr isEqualToString:@"FIRSTNAME"]){
[self.csd setFst:_foundvalue];
self.foundvalue=nil;
self.tempstr=nil;
}
if([self.tempstr isEqualToString:@"LASTNAME"]){
[self.csd setLst:_foundvalue];
self.foundvalue=nil;
self.tempstr=nil;
}
if([self.tempstr isEqualToString:@"STREET"]){
[self.csd setStreet:_foundvalue];
self.foundvalue=nil;
self.tempstr=nil;
}
if([self.tempstr isEqualToString:@"CITY"]){
[self.csd setCity:_foundvalue];
self.foundvalue=nil;
self.tempstr=nil;
}
if([elementName isEqualToString:@"CUSTOMER"]){
NSLog(@"%@",self.csd);
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if([self.tempstr isEqualToString:@"FIRSTNAME"]){
self.foundvalue=[[NSMutableString alloc]initWithString:string];
}
if([self.tempstr isEqualToString:@"LASTNAME"]){
self.foundvalue=[[NSMutableString alloc]initWithString:string];
}
if([self.tempstr isEqualToString:@"STREET"]){
self.foundvalue=[[NSMutableString alloc]initWithString:string];
}
if([self.tempstr isEqualToString:@"CITY"]){
self.foundvalue=[[NSMutableString alloc]initWithString:string];
}
}
@end
You are setting the label's text before the object self.csd is even set. That object will be set only after the parsing is done.
[[[NSURLSession sharedSession]dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// SMXMLDocument *document = [SMXMLDocument documentWithData:data error:&error];
NSString*str=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
_xmlparse=[[NSXMLParser alloc]initWithData:data];
_xmlparse.delegate=self;
[_xmlparse parse];
}] resume];
//This part will get executed even before the parsing is done.
// So self.csd is nil and so the label are getting empty string.
dispatch_async(dispatch_get_main_queue(), ^{
self.first.text=[self.csd fst];
self.last.text=[self.csd lst];
self.street.text=[self.csd street];
self.city.text=[self.csd city];
});
Now we will set the label, text as soon as the xml is parsed but be carefull with this as this will take time as it is in background thread and UI may be unchanged for sometime.
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName;{
// sent when an end tag is encountered. The various parameters are supplied as above.
if([self.tempstr isEqualToString:@"FIRSTNAME"]){
[self.csd setFst:_foundvalue];
//We are doing the UI stuff in main thread.
dispatch_async(dispatch_get_main_queue(), ^{
self.first.text = [self.csd fst];
});
self.foundvalue=nil;
self.tempstr=nil;
}
...
Now doing this you have both the self.csd ready for other processing and also UI is in updated.