質問

私は、自動生成されたアクセサのメソッドをオーバーライドすることについて質問があります。各ゲッターが他のゲッターを参照するため、以下は機能しません(私は信じています)。アクセサの方法は他のアクセサの方法を使用すべきではないというルールはありますか、それともこれらの状況に個別に注意する必要がありますか?

-(UIImage *) image{

    if(image == nil){
        if(self.data == nil){
            [self performSelectorInBackground: @selector(loadImage) withObject: nil]
        }else{
            self.image = [UIImage imageWithData: self.data];
        }
    }

    return image;
}

-(NSData *) data {

    if(data == nil){
        if(self.image == nil){
            [self performSelectorInBackground: @selector(loadData) withObject: nil]
        }else{
            self.data = UIImageJPEGRepresentation(self.image, 0.85);
        }
    }

    return data;
}

ここに示されている画像の使用は例であり、この特定の例で何をすべきかに関する考えは、一般的なケースよりも重要ではないことを強調する必要があります。

役に立ちましたか?

解決

まず、あなた自身の利益のためにあまりにも賢くないでください。ボトルネックを乗り越えたい場合は、最初に測定して、それが本当にそこにあることを確認してください。私はその両方を信じています UIImageNSData コードが本質的に役に立たないように、内部の怠zyなロードを行います。第二に、たとえ手でそのようなことをしたいと思っていたとしても、キャッシュコードを別のクラスに分割してみてください。そうすれば、メインクラスのコードを汚染しないようにしてください。

人々はアクセサにあまり怠zyなロードをしていないため、アクセサーズについてのルールはありません(少なくとも私が知っていることはありません)。時々、私は怠zyによって引き起こされる無限のループに捕まえる [UIViewController loadView] と組み合わせて [UIViewController view], 、しかしそれはそれについてです。

他のヒント

禁止するものは何もありませんが、混乱するコードを間違いなく書いています。基本的に、これらの2つのプロパティには循環依存性があります。これは読み取りとデバッグの両方が難しいです。 「画像をロードする」前に「データをロードする」ことを望む理由、または「データをロードする」前に「画像のロード」をサポートする理由、または2つのプロパティが実際にどのようにどのようにサポートするのかは明らかではありません。本当に2つの異なるものです。

この例で実際にしていることは、ロードに長い時間がかかる場合があります。スレッドが安全であることを確認するのが最善です。

さらに、データオブジェクトを実際のデータプロバイダー(通常はプロトコルを使用して)にし、クラスとは別にし、画像コンテナにゆるいロードされたオブジェクトを処理していることを露出させると、さらに優れています(一部からの抗き声が発生する可能性があります。人)。

具体的には、プロバイダーからロードデータ/イメージを呼び出し、AwakeFromnib(たとえば)から電話をかけることをお勧めします(たとえば) - ローダーはオフになり、セカンダリスレッドにデータをロードします(特にダウンロードした場合)。データプロバイダーにコールバックを提供して、画像の準備が整っていることを確認します(通常、プロトコルを使用して)。ビューが編成されていない画像を取得したら、データプロバイダーを無効にします。

最後に、アプリリソースを扱っている場合、「システム」はあなたのためにこれの一部をキャッシュします。あなたはすでに舞台裏で最適化されているものに反対しようとするでしょう。

要するに、それは通常問題です(例:怠zyな初期化ではありません) - しかし、この特定のデザイン(別のポスターが言ったように)には、最小化されるべき循環依存性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top