0

最終的にオブジェクトを使用して Core Data にクエリを発行findByXするジェネリッククラスで一連のマジック メソッドを開発しようとしています。ModelNSPredicate

  • (id)findByName;
  • (id)findByCreated;
  • ...

以前の SO の質問からのアドバイスに従って、存在しないメソッドを要求するメッセージをオーバーライドすることで傍受できますresolveInstanceMethod

#include <objc/runtime.h>

+ (BOOL) resolveInstanceMethod:(SEL)aSel {
  if (aSel == @selector(resolveThisMethodDynamically)) {
    class_addMethod([self class], aSel, (IMP) dynamicMethodIMP, "v@:");
    return YES;
  }
  return [super resolveInstanceMethod:aSel];
}

void dynamicMethodIMP(id self, SEL _cmd) {
  NSLog(@"Voilà");
}

ただし、[myObject resolveThisMethodDynamically]コンパイラを使用しようとすると、次のエラーが発生します。

"No visible @interface for 'MyModel' declares the selector 'resolveThisMethodDynamically'"

そのメソッドの宣言がないため、これは理にかなっています。それで、私はここで何が欠けていますか?これを達成するためのベストプラクティスはありますか?

ありがとうございました!

4

3 に答える 3

1

それがまさにあなたが求めているものかどうかはわかりませんが、この種の Core Data 機能に役立つリソースをいくつか紹介します。

MagicalRecord は Core Data 用の小さなフレームワークで、Ruby の世界の ActiveRecord のように機能します。特に、あなたが求めているフェッチ機能の多くを実装していると思います。NSManagedObject に追加されるカテゴリを確認してください。

お役に立てれば!

于 2012-08-28T09:08:45.047 に答える
0

これはかなり興味をそそられたので、いろいろと調べてみましたが、いくつかの選択肢があります。このスレッドはそれらをまとめたものです。個人的には、実行時にメソッドを追加する場合、コンパイル時にセレクターを選択するのではなく、実行時にも選択するべきであるという議論に同情します。そのため、NSSelectorFromString などを使用し、さまざまなプリプロセッサ ディレクティブを使用して、このような場合に警告を抑制します。

お役に立てれば!

于 2012-08-28T09:50:50.027 に答える