如何通过从服务器

时间:2016-11-29 13:06:44

标签: ios objective-c iphone web-services nsxmlparser

如何通过从服务器

获取数据来设置textfiled值

我从服务器获取xml数据但无法将这些值设置为textfield.can如果下面有任何代码,请纠正我

Customerdetails.h(模型)

@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

2 个答案:

答案 0 :(得分:1)

安装XML值的代码属于数据任务的完成处理程序:

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

您的代码可能存在其他问题,但肯定需要更改。

当前代码的工作方式是将代码安装到文本字段中的代码将在网络响应到达之前运行。

答案 1 :(得分:1)

在设置对象self.csd之前设置标签的文本。只有在解析完成后才会设置该对象。

[[[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];
    });

现在我们将在解析xml后立即设置标签文本,但要注意这一点,因为这需要时间,因为它在后台线程中并且UI可能会在一段时间内保持不变。

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

现在这样做,你可以让self.csd准备好进行其他处理,并且UI也在更新。