Thanks for sharing with the list.
I wonder what the purpose of NSURLConnection is in this solution? Aren't you in 
effect throwing away the benefits of asynchronous loading? The NSInputstream 
can block, and NSXMLParser presumably will. You will also have to deal with 
events in several places, and make sure errors are propagated up and down the 
stream.

Mikkel


On 6 Aug 2011, at 22:08, Thomas Davie wrote:

> Just for reference, With the help of Mike Ash I figured out how to do this 
> sensibly.  Note, code typed straight into Mail.app, so it may not be dead 
> perfect, but it should show the idea:
> 
> //When creating the NSURLConnection and parser:
> - (void)doMagicParsingStuff
> {
>    NSInputStream *iStream;
>    NSOutputStream *oStream;
>    CFStreamCreateBoundPair(NULL, &iStream, &oStream, 4096);
>    [oStream setDelegate:self];
>    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
>    [iStream scheduleInRunLoop:runLoop forMode:NSDefaultRunLoopMode];
>    [oStream scheduleInRunLoop:runLoop forMode:NSDefaultRunLoopMode];
>    finishedLoading = NO;
>    [iStream open];
>    [oStream open];
>    [self setParserStream:oStream];
>    NSXMLParser *parser = [[[NSXMLParser alloc] initWithStream:iStream] 
> autorelease];
> }
> 
> - (void)attemptToWriteToStream
> {
>    NSUInteger written = [[self parserStream] writeBytes:[[self buffer] bytes] 
> maxLength:[[self buffer] length]];
>    [[self buffer] replaceBytesInRange:NSMakeRange(0,written) withBytes:"" 
> length:0];
> }
> 
> // In the output stream delegate:
> - (void)stream:(NSStream *)s handleEvent:(NSStreamEvent)event
> {
>    if (NSStreamEventHasSpaceAvailable == event)
>    {
>        if (finishedLoading && [[self buffer] length] == 0)
>        {
>            [[self parserStream] close];
>        }
>        else
>        {
>            [self attepmtToWriteToStream];
>        }
>    }
> }
> 
> // In the NSURLConnection Delegate:
> - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d
> {
>    [[self buffer] appendData:d];
>    [self attemptToWriteToStream];
> }
> 
> - (void)connectionDidFinishLoading:(NSURLConnection *)connection
> {
>     finishedLoading = YES;
> }
> 
> 
> On 6 Aug 2011, at 12:14, Mikkel Islay wrote:
> 
>> You can't hook up NSURLConnection to NSXMLParser like that because it loads 
>> its data asynchronously. Rather, feed it (a copy of) the NSData object 
>> generated by NSURLConnection, or bypass NSURLConnection completely and load 
>> your data via NSInputStream. In either case you will have to verify that the 
>> data you feed to NSXMLParser is complete.
>> 
>> Mikkel
>> 
>> On 6 Aug 2011, at 12:02, Thomas Davie wrote:
>> 
>>> 
>>> I'm trying to figure out how to download and parse XML at the same time.  
>>> NSXMLParser seems to have support for this by providing it with an 
>>> NSInputStream.  However, I see no way to get an NSInputStream that contains 
>>> the data that an NSURLConnection is downloading.
>> 
> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to