2012-01-26 4 views
2

Objective-Cのカテゴリを使用して、サブクラス化の必要なしにクラスにメソッドを追加できることを理解しています。また、これらのカテゴリを使用してインスタンス変数をクラスに追加することはできません。インスタンス変数をNSDataに追加

私はインスタンス変数を追加するために使用することができ、クラスの拡張、読んを少しやったが、私は、このようなNSDataのような既存のクラスを変更するために、クラスの拡張機能を使用する方法を理解していません。

私がNSURLとのNSDataが含まれているコアデータモデルを持っている:

私の問題は次のようです。 NSDataは、NSURLのデータを表示します。ビューでデータを表示する必要がある場合は、次のチェックを行います。 --- [NSData bytes]> 0の場合、NSDataを表示します。 ---それ以外の場合は、NSURLのデータをフェッチし、それが十分に簡単

返したときにデータを表示します。しかし、私はNSURLが更新されるときに問題にぶつかります。したがって、[NSData bytes]がすでに0より大きいため、新しいイメージでNSURLパスを変更すると、新しいイメージを取得するための追加呼び出しは行われません。

私は何をしたいことはNSDataのにインスタンス変数を追加しているが、データがどこから来るかについての情報を保持しますURLKeyと呼ばれます。 CoreDataを使用しているためNSDataをサブクラス化できません。

誰でも簡単な解決策を知っていますか?多分、クラス拡張の理解にギャップがあるかもしれません。あるいは、単純な方法がないかもしれません。

+0

NSDataとNSURLの両方を認識している管理オブジェクトでチェックを行うことはできませんか? –

+0

私はできますが、私はこの機能を抽象化して特定のモデルに依存しないようにしたいと思います。 –

答えて

2

クラスの拡張機能を使用すると、クラスの外に見えるはずだけのものが含まれているべきである、アイバーズとヘッダファイルからの隠されたいくつかのプロパティを保つための方法として、自分自身を実装する(とアイバーズは、のようなものをare'tクラスで使用する必要がありますもの)。

カテゴリが追加機能を追加する方法として、すでに実装されたクラスで使用されています。それらは通常、既知のクラスに一般的な種類の動作を追加する場合に必要です。例えば。メソッドをNSStringに追加する+(NSString *)reversedString;

NSString *someString = @"string"; 
NSString *reverse = [someString reversedString]; 
NSLog(@"%@", someString); //this would output "gnirts" 

:あなたは、このようにそれを使用できるように逆のインスタンスを返します

あなたの特定の問題については、私はあなたのCoreDataModelがNSURLかのNSDataが含まれていないことを保証することができます。サポートされている型は、プリミティブ、文字列、バイナリのデータと変換可能な型です。したがって、NSDataまたはNSURLをサブクラス化し、タイプを "変換可能"に設定してCoreDataで使用することができます。これを済ませたら、必要に応じてNSDataをサブクラス化し、そのプロセスでクラス拡張を使用するか、カテゴリを使用してクラスに必要なメソッドを追加するだけです。アップルから

引用について変換可能な属性

変換可能な属性の背後にある考え方は、あなたは非標準型として 属性にアクセスすることですが、舞台裏コアデータは インスタンスを使用しています属性を との間で変換するNSValueTransformerをNSDataのインスタンスに変換します。コアデータは次に、データインスタンスを永続ストア に格納します。

+0

これは間違いなく正しいことです。しかし、クラスクラスターなので、NSDataのサブクラス化にはいくつかの問題がありました。だから、私はNSData属性とキーの両方を持つ別のクラスを作成し、それを実装しました。 –

関連する問題