Thanks Graham. Good info to have. cheers,
J. On 2009-12-13, at 3:02 PM, Graham Cox wrote: > > On 14/12/2009, at 4:29 AM, James Maxwell wrote: > >> I've got a potentially tricky problem here. My app is backed by a >> network-like data structure based on three objects: a Network_Controller, a >> Network, and a set of Nodes. The network is arranged in a hierarchy of >> levels, with each level having at least one node. The Network object stores >> this as a 2D NSArray; each level is an NSArray, which holds an NSArray of >> Nodes for the given level. The Nodes, obviously, also have parent/child >> relationships. >> Now, the problem has been in reading files saved using NSCoder. I'm >> reading/writing these files in a fairly typical manner, at this stage, by >> having the Network_Controller initiate the save, which tells the Network to >> encode its 2D array of Nodes, each of which encodes its necessary data, in >> turn (as per the typical way of using encodeWithCoder/initWithCoder). A >> single Node's data, however, includes references to parent/child Nodes. So >> the question is, how to best decode this from the file? Ideally, I suppose, >> it should start at the top level, decode the single top-level Node first, >> then work its way down. I'm not doing that, at this point, as I'm just >> letting the Network decode its 2D array of Nodes, and crossing my fingers. >> It loads, but the behaviour of the whole thing after loading is not what it >> should be - it's a complex system, so it's hard to identify exactly why, but >> it isn't doing what it should be doing. >> Any thoughts on how to manage this sort of decoding? And should I also >> approach the encoding in a particular way? > > > Hi James, > > You don't necessarily have to do anything special. Just encode & decode the > parent as normal. Naturally you don't want to retain the parent - that would > be a retain cycle. > > But you might also want to consider what would happen if you wanted to > archive a node independently of the rest of the network (perhaps for > cut/paste or something else). In that case you wouldn't want to drag in the > entire network when archiving, as it would if you just encoded the parent > unconditionally. In that case you would want to use > -encodeConditionalObject:forKey: which encodes the parent only if it has > already been encoded. > > That then leaves the final problem of dearchiving an independently archived > node and inserting it back into a network. That's usually just a case of > having the parent pass itself to a setParent: method of the node when you add > the node. But if there's also a chance of setting a whole bunch of nodes at > once, then the -makeObjectsPerformSelector: withObject: method is an easy way > to call -setParent: on all the inserted nodes at once. > > So a complete tree archiving/dearchiving solution typically combines all of > these. > > > --Graham > > _______________________________________________ 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: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com