• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: NSDocument -canCloseDocumentWithDelegate::: not called when terminating
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NSDocument -canCloseDocumentWithDelegate::: not called when terminating


  • Subject: Re: NSDocument -canCloseDocumentWithDelegate::: not called when terminating
  • From: Quincey Morris <email@hidden>
  • Date: Wed, 30 Aug 2017 10:30:38 -0700

On Aug 30, 2017, at 06:18 , Jonathan Mitchell <email@hidden> wrote:
>
> My documents have a lot of variable user cancellable activity that must run
> prior to document closure regardless of whether the document is dirty or not.

> My solution is to run a termination preflight that processes my clean
> documents prior to allowing actual termination,

There’s a difference between your scenario and the one in the thread you linked
to. In your case, you don’t need to write anything to the document itself, you
say.

I think it’s a (slight) conceptual mistake to tie the termination processing to
the document machinery, especially as overriding NSDocumentController is a bit
hacky even when done right. I also think it’s a mistake to override
“terminate:”, because it’s just an action method and you can’t be certain that
it’s actually going to be called. (The standard menu item could have a
different action method name in the future, or there may be paths within Cocoa
that don’t invoke the action method.)

Instead, the “applicationWillTerminate:” override of your app delegate seems
like the right place, especially because it explicitly permits you to delay
terminate while you do stuff, without having to run the run loop manually.
That’s the *point* of the “applicationWillTerminate:” mechanism.

The consequence of using this override, though, is that documents may already
have been closed. So, what I would suggest is maintaining a separate pool of
“tasks” (a set of document references would be the simplest approach). In an
override of “close”, start the user cancellable activity and remove the
corresponding task from the pool. In “appWillTerminate:”, trigger any remaining
tasks, and send the termination reply when they’re all done.

The reason I’m suggesting “close” rather than “canClose…” is just that it’s
simpler, and it avoids getting tangled up in any possible code path where the
close is prevented.

_______________________________________________

Cocoa-dev mailing list (email@hidden)

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:

This email sent to email@hidden

  • Follow-Ups:
    • Re: NSDocument -canCloseDocumentWithDelegate::: not called when terminating
      • From: Jonathan Mitchell <email@hidden>
References: 
 >NSDocument -canCloseDocumentWithDelegate::: not called when terminating (From: Jonathan Mitchell <email@hidden>)

  • Prev by Date: NSDocument -canCloseDocumentWithDelegate::: not called when terminating
  • Next by Date: Re: NSDocument -canCloseDocumentWithDelegate::: not called when terminating
  • Previous by thread: NSDocument -canCloseDocumentWithDelegate::: not called when terminating
  • Next by thread: Re: NSDocument -canCloseDocumentWithDelegate::: not called when terminating
  • Index(es):
    • Date
    • Thread