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