iOS Obj-C.提出正确的解决方案?

wun*_*tee 9 objective-c ios

我在我的应用程序中的一个地方,基本上每个ViewController都有一个本地NSManagedObjectContext:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
Run Code Online (Sandbox Code Playgroud)

每个segue都通过同一个setter传递managedObjectContext

[segue.destinationViewController setManagedObjectContext:self.managedObjectContext];
Run Code Online (Sandbox Code Playgroud)

来自Java,可以很容易地创建每个ViewController实现的抽象类.在Objective-c中,似乎没有可能.我要做的是有一个执行此传递的基类,但基本上任何实现UIViewController的都将具有此功能(包括一个简单的UIViewController以及一个UITableViewController).是否有可能/正确创建一个"抽象"类,构成UIViewController这样做?

更新:

的UIViewController + ManagedObjectContext.h

@interface UIViewController (ManagedObjectContext)
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@end
Run Code Online (Sandbox Code Playgroud)

的UIViewController + ManagedObjectContext.m

#import "UIViewController+ManagedObjectContext.h"
@implementation UIViewController (ManagedObjectContext){
    NSManagedObjectContext *context;    // This is not valid, cant have local variables
}
@synthesize managedObjectContext; // This is not valid, must be @dynamic
-(void)setManagedObjectContext:(NSManagedObjectContext *)context{
    //How do you have a local NSManagedObjectContext?
}
@end
Run Code Online (Sandbox Code Playgroud)

rob*_*off 5

你可以只让自己的子类UIViewController,比方说MOCViewController,与managedObjectContext财产.然后使所有其他视图控制器成为子类MOCViewController而不是直接子类化UIViewController.

如果您确实希望使用类别执行此操作,则您的类别可用于objc_setAssociatedObject将托管对象上下文附加到视图控制器.

如果您只有一个托管对象上下文并且只是在任何地方传递它,请考虑将上下文放在应用程序委托的属性中,或者放在全局变量中.


rai*_*ade 5

您可以从托管对象获取managedObjectContext,而不是单独传递它.通常,传递托管对象更合乎逻辑.

例如:假设您有一个名为thing的托管对象,您可以通过调用获取managedObjectContext

NSManagedObjectContext *moc=[thing managedObjectContext];
Run Code Online (Sandbox Code Playgroud)

或者,您可以从应用程序委托中获取托管对象上下文:

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *moc = delegate.managedObjectContext;
Run Code Online (Sandbox Code Playgroud)