0

对于我的 iOS 应用程序,我正在实现一个几乎存在但不完全存在的“惰性”数据加载方案。因此,我重写了我的UIView子类drawRect方法:

被覆盖的drawRect方法

CGContextRef context = UIGraphicsGetCurrentContext();

[self.featureSource featuresForInterval:interval completionHandler:^(NSData *data) {

    // Create list of features from retrieved data
    FeatureList *features = [[[FeatureList alloc] initWithData:data] autorelease];

    // Render features
    [self.currentRenderer renderInContext:context rect:rect featureList:featureList;
}];

一个绘制红色的简单渲染器:

// A trivial renderer that paints red
- (void)renderInContext:(CGContextRef)context rect:(CGRect)rect featureList:(FeatureList *) featureList {

    [[UIColor redColor] setFill];
    UIRectFill(rect);

}

特征检索方法...

- (void)featuresForInterval:(FeatureInterval *)interval completionHandler:(void (^)(NSData *))completionHandler

NSURLConnection... 使用的异步委托方法回调从云端检索数据。在数据完成方法中,- (void)connectionDidFinishLoading:(NSURLConnection *)connection我调用completionHandler上面显示的方法来进行实际渲染。

问题。这成功地检索了数据,但是当调用渲染方法时没有绘制任何内容。我在控制台上收到以下消息:

2013-01-08 21:02:34.417 IGV[49732:f803] -[URLDataLoader connection:didReceiveResponse:] [Line 248] data 0
2013-01-08 21:02:34.417 IGV[49732:f803] -[URLDataLoader connection:didReceiveData:] [Line 260] data 998
2013-01-08 21:02:34.419 IGV[49732:f803] -[URLDataLoader connection:didReceiveData:] [Line 260] data 2446
2013-01-08 21:02:34.423 IGV[49732:f803] -[URLDataLoader connection:didReceiveData:] [Line 260] data 3845
2013-01-08 21:02:34.424 IGV[49732:f803] -[URLDataLoader connectionDidFinishLoading:] [Line 275] data 3845
Jan  8 21:02:34 new-host-5.home IGV[49732] <Error>: CGContextSetFillColorWithColor: invalid context 0x0
Jan  8 21:02:34 new-host-5.home IGV[49732] <Error>: CGContextGetCompositeOperation: invalid context 0x0
Jan  8 21:02:34 new-host-5.home IGV[49732] <Error>: CGContextSetCompositeOperation: invalid context 0x0
Jan  8 21:02:34 new-host-5.home IGV[49732] <Error>: CGContextFillRects: invalid context 0x0

有人可以帮助我了解这里发生了什么。

谢谢,
道格

4

2 回答 2

0

您需要调用[yourView setNeedsDisplay]以使其呈现。CGContextRefiOS在运行循环期间为您设置 ,以便在您调用UIGraphicsGetCurrentContext(). 调用[yourView setNeedsDisplay]将启动该过程,您无需drawRect直接调用。

您可能想阅读本文以了解有关机制的更多详细信息。

于 2013-01-09T14:20:03.407 回答
0

问题是您的请求是异步的。这意味着 drawRect: 在请求完成之前完成。
考虑在您的视图类上创建一个属性/变量并实现 drawRect: 如下所示:

if(self.features) {
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self.currentRenderer renderInContext:context rect:rect featureList:featureList;
} else {
    [self.featureSource featuresForInterval:interval completionHandler:^(NSData *data) {

        // Create list of features from retrieved data
        self.features = [[[FeatureList alloc] initWithData:data] autorelease];
        [self setNeedsDisplay];
    }];
}
于 2013-01-09T14:21:54.207 回答