CFHipsterRef Low-Level Programming on iOS & Mac OS X

Incrementally Reading an Image

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    [self.mutableResponseData appendData:data];

    CGImageSourceUpdateData(self.imageSourceRef,
        (__bridge CFDataRef)self.mutableResponseData,
        [self.mutableResponseData length]
        [dataTask countOfBytesExpectedToReceive]);

    if (CGSizeEqualToSize(self.imageSize, CGSizeZero))
    {
        NSDictionary *properties =
            (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(self.imageSourceRef,
    0, NULL);

        if (properties)
        {
            NSNumber *width = properties[(__bridge id)kCGImagePropertyPixelWidth];
            NSNumber *height = properties[(__bridge id)kCGImagePropertyPixelHeight];

            if (width && height)
            {
                self.imageSize = CGSizeMake([width floatValue],
            }
        }
    }

    CGImageRef imageRef =
        CGImageSourceCreateImageAtIndex(self.imageSourceRef, 0,
    NULL);
    UIImage *image = [UIImage imageWithCGImage:imageRef];
    CFRelease(imageRef);

    dispatch_async(dispatch_get_main_queue(), ^{
    // delete or block callback to update with image
    });
}