将AppDelegate导入模型?

All*_*len 1 core-data objective-c

我正在尝试统一模型文件中特定类的所有函数.例如,我在模型'Contact.h/Contact.m'中有一个函数fetchContactWithName:(NSString*)name,我的viewcontroller随后会调用它.

在这种情况下,将AppDelegate.h文件导入到模型文件中是不是一个坏主意,因为我需要访问它的managedObjectContext?

#import "AppDelegate.h"

@implementation Contact

...

+ (Contact *) fetchContactWithName:(NSString *) name {
  AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
  NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:delegate.managedObjectContext];
  [fetchRequest setEntity:entity];

  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", name];
  [fetchRequest setPredicate:predicate];

  NSError *error = nil;
  NSArray *fetchedObjects = [delegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];

  Contact *fetchedContact;
  for(Contact *contact in fetchedObjects) {
      fetchedContact = contact;
  }

  if(fetchedContact != nil) {
      return fetchedContact;
  } else {
      return nil;
  }

}
@end
Run Code Online (Sandbox Code Playgroud)

Mat*_*uch 5

在我看来,直接要求另一个类来获取您的托管对象上下文是一个坏主意.因为

  1. 您无法在不同的项目中重用您的类(想想OS X应用程序)
  2. 您无法在不同的上下文中获取联系人(想想后台导入)
  3. 如果方法询问其他类,则不能使用单元测试

你应该告诉这个方法它应该在哪个上下文中获取.签名应该如下所示,
而不是+ (Contact *) fetchContactWithName:(NSString *) name您的方法:

+ (Contact *)fetchContactWithName:(NSString *)name inManagedObjectContext:(NSManagedObjectContext *)context
Run Code Online (Sandbox Code Playgroud)

每个viewController都应该引用应用程序委托中使用的NSManagedObjectContext.您可以将上下文的引用传递给每个viewController application:didFinishLaunchingWithOptions:,每次推送或呈现新的viewController时,都会将上下文实例传递给它.

这可能看起来像现在很多工作,但有一天你会受益于"告诉,不要问"的方法.