Thanks again Keary. 

On 12 ביול 2012, at 02:54, Keary Suska wrote:

> On Jul 11, 2012, at 2:45 PM, Motti Shneor wrote:
>> Of what I read from everyone, and after examining the suggested code from 
>> Jens Alfke, I think I'm inclined to something simpler, hinted by  Keary 
>> Suska.  Could you spare a few more words on the "undefinedKey" override? 
> 
> I would create a base class that implements -valueForUndefinedKey: and 
> -setValue:forUndefinedKey: (per the doc links that another poster provided). 
> These methods would simply get/set from the dictionary. The only thing that 
> requires a little consideration is how you may choose to validate the key (if 
> at all)--i.e. determine whether you want to throw an exception for unknown 
> keys. You can throw by simply calling super's implementation. To validate you 
> could keep an array of valid key names (somewhat fragile, as you need to keep 
> it updated), or use runtime inspection functions (see: 
> https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html#//apple_ref/doc/uid/TP40008048-CH101-SW24).
>  More cryptic but not fragile.
> 

Thanks, I think this is exactly what I was looking for.

In my case it is almost trivial. These classes maintain dictionaries to convert 
from the class' Keys (properties) to the base-model (CoreData) attribute names 
in the schema. I can simply look up the internal key, and throw (via super 
implementation of valueForUndefinedKey/setValue:forUndefinedKey) if I can't 
find it.

If I'm going this route, do I still need to use the @dynamic for my properties? 
after all --- promised implementations wont be available in runtime. I rely on 
a KVO pre-exception mechanism. 

>> Obviously, I would use CoreData if I could. In fact, we use CoreData for the 
>> base model of our application. However, there is another "layer" higher than 
>> the CoreData model, that consists of intermediate data objects that serve as 
>> mediators between server messages and our "real" model objects in CoreData. 
>> The "Keys" or property-names are dictated by server definitions, and do not 
>> fully match those we have in our CoreData model. 
>> 
>> We don't want these objects to be stored, and we don't want them to be 
>> dependent on some managedObjectContext (for threading reasons). Just simple, 
>> old-style, model objects. 
> 
> I actually have a large project that uses pars of Core Data without an 
> NSManagedObjectContext, as I have to use a specific RDBMS back-end. In fact, 
> the context isn't needed unless you want storage and/or synchronization 
> (relationship management, etc). I use a Managed Object Model to represent the 
> data schema so I can have introspection, and subclass NSManagedObject. I also 
> use the undefined-key technique for them, using the associated 
> NSEntityDescription for key validation. I also have a system that allows 
> properties to be added dynamically from SQL query results. Works like a charm.

Can I come work with you? :) I like it. Sounds like a healthy little system...

Do you use the graphic tool for defining the Managed Object Model, or do you do 
this programmatically? 
If I choose this way, I'd like still to be able to auto-generate the classes 
from the schema. Our "cross-platform guys" would not rest until they see a 
concrete source file declaring a C++ style class with their own eyes.  
Also, when you have a "partial-use" of CoreData (a NSManagedObject subclass 
that lives without a context) How do you instantiate it? via alloc init? 
CoreData API demands a context...
+ (id)insertNewObjectForEntityForName:(NSString *)entityName 
inManagedObjectContext:(NSManagedObjectContext *)context;

>> I'd like to avoid dynamic auto-generation of methods at runtime. I can't see 
>> why this is needed --- ALL my getters and setters will look exactly the same.
> 
> As was mentioned, you at least have to specify @dynamic, which really only 
> promises the compiler that valid getter/setters will be available at runtime.

This is alright with me. @dynamic we'll write :)

> 
>> The reason we insist on dot-notation for accessing these objects, is that 
>> the code which does this, is written in C++ or C style, using structs and 
>> dot notation. That code could compile with no change against C++ data 
>> objects (in Windows) or against my Propery-based data objects for Mac. 
> 
> This is all fine--just means that you have to create the classes and declare 
> the properties to make the compiler happy.

We do it anyway today.... There will be no change to the header files. I only 
wish to delete current implementation, in favor of compact, generic code in a 
super class.
> 
> HTH,

This HELPS indeed. Thanks.

Motti Shneor
---------------------------------------------------------
Ceterum censeo Microsoftinem delendam esse





_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to