-1

I don't know why this is being so difficult but I can't get this to work. Here's my simple problem:

I have a UIViewController that calls paring class type of NSObject class that does the parsing jobs.

I just need the parsed data values to be returned back to that ViewController.

Could any body provide me a simple step or any suggestion to do this... I really need this issue to be solved for my project and the deadline is near...

Thanks Here is my code:

ViewController.m

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    wsClass *ws = [[wsClass alloc] init];
    [ws initParsing];
}

wsClass.h

@interface ProjListClass : NSObject

@property(nonatomic,strong) NSString * PROJECT_ID;
@property(nonatomic,strong) NSString * SHORT_DESCR;
@property(nonatomic,strong) NSString * LOCATION;
@end;

@interface wsClass : NSObject <NSXMLParserDelegate>{
ProjListClass *proj_obj;
ProjListClass *prj;

NSMutableData* webData;
NSMutableString *soapResults;
NSURLConnection *conn;

NSXMLParser *xmlParser;

}
@property(nonatomic,strong) NSMutableArray * arrHouses;
@property(nonatomic, strong)     NSXMLParser *xmlParser;

-(void) initParsing;
@end

wsClass.m

#import "wsClass.h"

@implementation ProjListClass
@synthesize PROJECT_ID, SHORT_DESCR, LOCATION;
@end

@implementation wsClass

@synthesize arrHouses, xmlParser;

-(void) initParsing{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    soapResults = [[NSMutableString alloc] init];
    arrHouses=[[NSMutableArray alloc]init];

    NSString *soapMessage = [NSString stringWithFormat:
                         @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                         "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
                         "<soap:Body>\n"
                         "<Projects_List xmlns=\"http://tempuri.org/\"/>\n"
                         "</soap:Body>\n"
                         "</soap:Envelope>\n"];
   NSURL *url = [NSURL URLWithString:@"http://192.168.0.10:8056/WServices.asmx"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];

[theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[theRequest addValue: @"http://tempuri.org/Projects_List" forHTTPHeaderField:@"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

conn = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if( conn )
{
    webData = [NSMutableData data];
}
else
{
    NSLog(@"theConnection is NULL");
}   
}
....
....
....
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
   NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    if (xmlParser)
  {
    xmlParser=nil;
  }
  xmlParser = [[NSXMLParser alloc] initWithData: webData];
  [xmlParser setDelegate: self];
  [xmlParser setShouldResolveExternalEntities:YES];
  [xmlParser parse];
 }

 ....
 ....
 ....
 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
 namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
.....
.....
.....
 else if([elementName isEqualToString:@"ProjectsListDetails"])
{
    [arrHouses addObject:proj_obj];
    proj_obj=nil;
}

soapResults = nil;
soapResults = [[NSMutableString alloc]init];
}
Mr.KLD
  • 2,632
  • 2
  • 16
  • 26

2 Answers2

1

See below Steps would give you some idea

1) Inside the Your NSOBject Class say ParsingModel class, Create Protocol Inside that parsing Class where you doing parsing. give name whatever you want.

   @protocol  WebServiceResponseDelegate <NSObject>

   @optional
  - (void)didRecieveResponseData:(NSMutableArray*)array;

  @end

Implement this protocol to the Parsing Class like this @protocol WebServiceResponseDelegate;

Create Property Inside the Parsing Class so that could set the Delegate from confirming class..

      @property   (nonatomic, assign) id<WebServiceResponseDelegate>delegate;

and Just need to send the Parsed Data To the Confirming Class i.e from where you created parsing object

   //say didRecieveResponse this is the method called when you completed parsing of data

 // - (void)didRecieveResponse
  // {   
  //  if([delegate respondsToSelector:@selector(didRecieveResponseData)])
 //    {
  //    //pass populated dataSource which would have the Parsed Data.

  //    [delegate didRecieveResponseData:parsedData];
 //    //  parsedData is the NUMtableArray or any other DataSource.

  //}

EDIT: See below is the delegate method called when you finished the paring successfully

  - (void)parserDidEndDocument:(NSXMLParser *)parser{
    //pass populated dataSource which would have the Parsed Data.  

    //before check whether that delegate method confirmed by the class.

    if([delegate respondsToSelector:@selector(didRecieveResponseData)])
     {
       [delegate didRecieveResponseData:parsedData];
     }

   //  parsedData is the NUMtableArray or any other DataSource.

   }
  // called when the parser has completed parsing. If this is encountered, the parse was successful.you need to call

2) And Inside the Confirming Class as You said UIViewController say DataViewController define That delegate Method in your DataViewController.h adopt that protocol like this DataViewController<WebServiceResponse>

And set Delegate from the point at where you creating the parsing model class like this

  ParsingModel * paring = [ParsingModel alloc]init];
  [paring setWebServiceResponseDelegate:self];

 //definition of callback delegate method
 - (void)didRecieveResponseData:(NSMutableArray*)array
 {
 //here you would have the Parsed Data now you can use it as you want

 }

I hope everything clear to you.

Kamar Shad
  • 6,089
  • 1
  • 29
  • 56
  • thanks Kamarshad, I have edited my thread and pasted my code, could please have a look at it and tell me where to change in my code... Regards – Mr.KLD May 03 '13 at 13:22
  • its my current code that i'm using, tell how I can apply the protocol. – Mr.KLD May 03 '13 at 13:47
  • @Mr.KLD See my edit, changed the code,.If still you don't understand then i can't help you further.actually here Over S/O we discuss the logic rather than provide whole running code.and what i think u looking for whole running code. man just look into the code and try to get some idea from it. – Kamar Shad May 03 '13 at 14:00
0

You can create a protocol in your NSObject class, trigger it when all your parsing operations have finished and set your view controller as a delegate.