Come richiamare un metodo in un momento particolare in modo asincrono ogni giorno nell'applicazione Mac? [chiuso]

1

Questa è la mia prima applicazione per Mac.

Vorrei inviare e-mail confrontando la data corrente e la data salvata dei client dall'utente in sqlite solo una volta - ogni giorno a seconda della condizione, in modo asincrono.

    
posta Lion 11.04.2012 - 13:51
fonte

2 risposte

3

Nota: presumo che con "asincrono" intendi "fai questo indipendentemente dal fatto che l'utente abbia effettuato l'accesso e che esegua l'applicazione alle 9:30 am".

Il modo giusto per farlo è registrare una chiamata con launchd che gestisce il lavoro appropriato per la tua applicazione. Quando e come lo fai è alquanto flessibile. Se stai utilizzando uno script di installazione di .pkg -type, puoi registrare l'helper durante l'installazione. Oppure puoi registrarti al primo avvio della tua applicazione, magari dopo che l'utente ha fornito sufficienti informazioni di configurazione per l'app helper per fare il suo lavoro.

La guida dei demoni e dei servizi approfondisce come farlo in grande dettaglio. Raccomando di leggerlo. E per una descrizione delle proprietà plist che launchd guarda a questo pagina manuale .

Come esempio di livello molto alto, supponiamo che la tua helper application possa essere trovata nel tuo pacchetto sotto MyPackage.app/Contents/SharedSupport/bin/myhelper . Ecco un file plist che lo lancerà ogni giorno alle 9:30 e alle 21:30 sulla macchina:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <!-- This label needs to be unique to the system -->
    <key>Label</key>
    <string>com.mycompany.mypackage.myhelper</string>

    <!-- Toggle to true to prevent it from running -->
    <key>Disabled</key>
    <false/>

    <!-- This is the full path to the helper application -->
    <key>Program</key>
    <string>/Applications/MyPackage.app/Contents/SharedSupport/bin/myhelper</string>

    <!-- This is an array of string arguments to pass in to the app when it's called -->
    <key>ProgramArguments</key>
    <array>
        <string>--daemon</string>
    </array>

    <!-- This works much like cron to state when the job should be run -->
    <key>StartCalendarInterval</key>
    <array>
        <!-- Run at 9:30 am -->
        <dict>
            <key>Minute</key>
            <integer>30></integer>
            <key>Hour</key>
            <integer>9</integer>
        </dict>
        <!-- Run at 9:30 pm -->
        <dict>
            <key>Minute</key>
            <integer>30></integer>
            <key>Hour</key>
            <integer>21</integer>
        </dict>
    <array>
</dict>
</plist>

Salvalo in /Library/LaunchAgents/com.mycompany.mypackage.myhelper.plist sul tuo computer e poi digita:

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

Per registrarlo subito con launchd . Al riavvio dovrebbe registrarsi automaticamente. Vedi launchctl man page per ulteriori informazioni su come utilizzarlo per interfacciare con launchd.

    
risposta data 11.04.2012 - 15:32
fonte
0

(Supponendo che stai usando Objective-C / Cocoa)

Il percorso che avrei intrapreso:

  1. Calcola la quantità di tempo per l'evento

  2. Usa performSelector:withObject:afterDelay: (disponibile su NSObject )

  3. Includi eventuali ulteriori logiche aggiuntive (come chiamate ad altri metodi o la tua logica email) nel metodo indicato nel metodo precedente.

risposta data 11.04.2012 - 15:08
fonte

Leggi altre domande sui tag