0

我正在尝试findByX在通用Model类中开发一组魔术方法,最终将使用NSPredicate对象向 Core Data 发出查询:

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

根据先前 SO question的建议,我可以通过覆盖来拦截请求不存在方法的消息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

我不确定它是否正是您所追求的,但这里有一些对这种核心数据功能有用的资源:

MagicalRecord 是一个用于 Core Data 的小型框架,使其工作起来很像 Ruby 世界中的 ActiveRecord。特别是,我认为它实现了您所追求的许多获取功能。查看它添加到 NSManagedObject 的类别。

希望这可以帮助!

于 2012-08-28T09:08:45.047 回答
0

这让我很好奇,所以我四处搜索,有很多选择。这个线程总结了它们。就个人而言,我很赞同这样的论点,即如果您在运行时添加一个方法,您不应该在编译时选择选择器,而是在运行时也这样做。因此,使用 NSSelectorFromString 等,以及一些不同的预处理器指令来抑制这种情况下的警告。

希望这可以帮助!

于 2012-08-28T09:50:50.027 回答
-1

采用

objc_msgSend( myObject, sel_getUid("yourMethod"), param1, param2...);

不要忘记导入'objc/message.h'

于 2014-05-14T22:28:55.367 回答