1 votes

Comment invoquer une méthode à un moment particulier de manière asynchrone chaque jour dans une application Mac?

C'est ma première application Mac.

Je voudrais envoyer des e-mails en comparant la date actuelle et la date enregistrée des clients par l'utilisateur dans sqlite une seule fois - chaque jour en fonction de la condition, de manière asynchrone.

3voto

shsteimer Points 8749

Note : Je suppose que par "asynchrone", vous voulez dire "faire ceci que l'utilisateur soit connecté ou non et que l'application tourne à 9h30 du matin".

La bonne façon de faire cela est de enregistrer un appel avec launchd qui gère le travail approprié pour votre application. Quand et comment vous le faites est quelque peu flexible. Si vous utilisez un script d'installation de type .pkg, vous pouvez enregistrer l'assistant à l'installation. Ou vous pouvez enregistrer lors de la première exécution de votre application, peut-être après que l'utilisateur ait fourni suffisamment d'informations de configuration pour que l'application auxiliaire puisse faire son travail.

Le guide Daemons and Services entre dans les détails pour expliquer comment faire cela en grande détail. Je recommande la lecture. Et pour une description des propriétés de plist sur lesquelles launchd se concentre, consultez cette page manuelle.

À titre d'exemple très général, supposons que votre application auxiliaire se trouve dans votre package sous MyPackage.app/Contents/SharedSupport/bin/myhelper. Voici un fichier plist qui le lancera tous les jours à 9h30 et 21h30 sur la machine :

    Label
    com.mycompany.mypackage.myhelper

    Disabled

    Program
    /Applications/MyPackage.app/Contents/SharedSupport/bin/myhelper

    ProgramArguments

        --daemon

    StartCalendarInterval

            Minute
            30
            Hour
            9

            Minute
            30
            Hour
            21

Enregistrez ce fichier dans /Library/LaunchAgents/com.mycompany.mypackage.myhelper.plist sur votre machine et ensuite tapez :

sudo launchctl load /Library/LaunchAgents/com.mycompany.mypackage.myhelper.plist

Pour l'enregistrer immédiatement avec launchd. Au redémarrage, il devrait s'enregistrer automatiquement. Consultez la page man de launchctl pour plus d'informations sur son utilisation pour interagir avec launchd.

0voto

ironfroggy Points 3496

(En supposant que vous utilisez Objective-C/Cocoa)

La démarche que je suivrais :

  1. Calculer le temps restant avant l'événement

  2. Utiliser performSelector:withObject:afterDelay: (disponible sur NSObject)

  3. Inclure toute logique supplémentaire (comme des appels à d'autres méthodes, ou votre logique d'email) dans la méthode indiquée dans la méthode ci-dessus.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X