Note that there are some explanatory texts on larger screens.

plurals
  1. PONSURLConnection - Is it possible to wait/block on a request?
    primarykey
    data
    text
    <p>I need to wait for a response from a SOAP webservice, I am calling via a NSURLConnection as I need to manipulate the data being returned and then return it from my class to the calling class..</p> <p>Here is my code:</p> <pre><code>#import &lt;Foundation/Foundation.h&gt; @interface UsersBLL : NSObject { NSMutableData *webData; NSMutableString *soapResults; NSXMLParser *xmlParser; BOOL *recordResults; NSNumber *EmailCount; } @property(nonatomic, retain) NSMutableData *webData; @property(nonatomic, retain) NSMutableString *soapResults; @property(nonatomic, retain) NSXMLParser *xmlParser; -(int)checkEmailAddress:(NSString*)emailAddress; @end #import "UsersBLL.h" @implementation UsersBLL @synthesize webData; @synthesize soapResults; @synthesize xmlParser; -(id)init { self = [super init]; return self; } -(int)checkEmailAddress:(NSString*)emailAddress { // Build the SOAP envelope NSString *soapMessage = [NSString stringWithFormat: @"&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n" "&lt;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/\"&gt;\n" "&lt;soap:Body&gt;\n" "&lt;CheckEmailAddress xmlns=\"http://tempuri.org/\"&gt;\n" "&lt;EmailAddress&gt;%@&lt;/EmailAddress&gt;\n" "&lt;/CheckEmailAddress&gt;\n" "&lt;/soap:Body&gt;\n" "&lt;/soap:Envelope&gt;\n", emailAddress]; NSLog(soapMessage); NSURL *url = [NSURL URLWithString:@"http://photoswapper.mick-walker.co.uk/UsersService.asmx?op=CheckEmailAddress"]; 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/CheckEmailAddress" forHTTPHeaderField:@"SOAPAction"]; [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"]; [theRequest setHTTPMethod:@"POST"]; [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if( theConnection ) { webData = [[NSMutableData data] retain]; } else { NSLog(@"theConnection is NULL"); } NSLog(@"%@", EmailCount); } -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [webData setLength: 0]; } -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [webData appendData:data]; } -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"ERROR with theConenction"); [connection release]; [webData release]; } -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"DONE. Received Bytes: %d", [webData length]); NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; NSLog(theXML); [theXML release]; if( xmlParser ) { [xmlParser release]; } xmlParser = [[NSXMLParser alloc] initWithData: webData]; [xmlParser setDelegate: self]; [xmlParser setShouldResolveExternalEntities: YES]; [xmlParser parse]; [connection release]; [webData release]; } -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName attributes: (NSDictionary *)attributeDict { if( [elementName isEqualToString:@"CheckEmailAddressResult"]) { if(!soapResults) { soapResults = [[NSMutableString alloc] init]; } recordResults = TRUE; } } -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if( recordResults ) { [soapResults appendString: string]; } } -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if( [elementName isEqualToString:@"CheckEmailAddressResult"]) { recordResults = FALSE; NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init]; EmailCount = [formatter numberFromString:soapResults]; [formatter release]; [soapResults release]; soapResults = nil; } } @end </code></pre> <p>CheckEmailAddress is declared as returning an integer value (I know it returns nothing in the sample above). </p> <p>What I ideally want, is through the CheckEmailAddress method, return the value retrieved from the web service. However as the call NSURLConnection does not wait until the request has completed, I cannot do it.</p> <p>I would be grateful if anyone could give me any potential ideas for workarounds.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload