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 に答える