On Dec 1, 2010, at 11:08, Mikkel Eide Eriksen wrote:

> See line 48 & onwards below:
> 
> http://code.google.com/p/cocoa-gedcom/source/browse/trunk/GCCoreData/src/GCDocument.m
> 
> (there are probably lots of terribly ugly non-Cocoa things in here, I'm only 
> just starting out and come from a mostly perl/python/java background)

Well, this would have be a much shorter thread if you'd posted a link to the 
code earlier. :)

Your issue is absolutely nothing to do with bindings, but rather a 
misunderstanding about how window content gets updated (drawn). In general, 
things you do in code that require the window to be redrawn are deferred and 
coalesced, and the drawing occurs in a separate iteration of the main event 
loop.

In your 'readFromURL...' method, you do things that require a redraw (change 
properties that UI views are bound to), but you're in a tight compute loop till 
the entire process is complete. You never return to the main event loop until 
the end, so the window never updates.

That's why invoking 'display' on the window seems to "fix" the problem, but 
that's not the correct solution because it shuts out the entire deferred 
drawing mechanism that's fundamental to Cocoa.

If opening a document is a long process (more than a couple of seconds), then 
there are three basic approaches:

1. Break the operation into smaller steps, and arrange to return to the main 
event loop after each step. (This means you're going to start the process in 
'readFromURL...', but you're going to return more or less immediately and 
finish the process elsewhere.)

2. Move the guts of the process into a background thread, so that user 
interaction (including window updates) .

3. Process events during your 'readFromURL...' loop. (This is called a modal 
event loop.)

All three approaches are non-trivial, though not exactly rocket science once 
you're familiar enough with the frameworks. However, the progress window is a 
considerable complication, and the best implementation depends on which 
approach you choose.

Approach #1 is probably the easiest of these. You can use 'performSelector: ... 
afterDelay: ...' to "schedule" a separate method that performs a few iterations 
of your loop. Or, you can look into GCD and Blocks.

Distasteful as it may be, your best approach *for now* might be:

4. Don't use a progress (loading) window at all, but just let opening a 
document take as long as it takes. Come back to this refinement of the UI 
later, when Cocoa is more familiar.

I must also issue the standard warning: If this is basically your first Cocoa 
project and you're using Core Data, you're in for quite a lot of pain before 
you're done.


_______________________________________________

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

Reply via email to