Domanda

Quando OS X decide di dare alla tua app un pallone da spiaggia rotante? Cosa puoi fare durante la programmazione di un'applicazione per evitarlo?

È stato utile?

Soluzione

Il server di finestre mostrerà il cursore di attesa rotante quando l'applicazione in primo piano o l'applicazione che ha una finestra sotto il puntatore del mouse non ha risposto agli eventi dal server di finestre entro un determinato intervallo di tempo.

Per evitare il cursore di attesa rotante, un'applicazione deve servire gli eventi in modo tempestivo. Non c'è modo di aggirare il comportamento di questo server finestra, e per una buona ragione: le applicazioni su Mac OS X non devono mai rispondere agli utenti.

Altri suggerimenti

Il motivo è che l'app sta bloccando l'interfaccia utente. Come hanno detto gli altri poster, il gestore della finestra può notare che non hai gestito gli eventi da un po 'di tempo e ha creato questa interfaccia utente.

Molto probabilmente stai eseguendo alcuni IO (come leggere o scrivere sul disco o fare richieste di rete) in modo sincrono sul thread dell'interfaccia utente (impostazione predefinita). Una buona regola empirica per mantenere la tua app reattiva (ed evitando così il beachball) è di non fare mai IO sincrono sul thread dell'interfaccia utente. Puoi utilizzare l'IO asincrono (API che accettano un callback, funzionano su un thread in background e poi ti avvisano sul thread dell'interfaccia utente quando hanno finito), oppure puoi utilizzare un thread in background separato per fare il lavoro.

Se non stai eseguendo IO, probabilmente stai eseguendo una sorta di ciclo lungo sul thread dell'interfaccia utente che ti sta causando la mancata risposta. In tal caso, ottimizza o rimuovi il loop o spostalo in un thread in background.

Supponendo che la tua applicazione disponga di risorse hardware sufficienti (che non sarà sempre il caso nella realtà), non c'è davvero alcun motivo per cui la tua app dovrebbe mai essere beachball. In tal caso, capire quale sezione di codice sta bloccando l'interfaccia utente (se è utile non intuitivo Shark.app tornerà utile) e spostarlo su un thread in background (o utilizzare un'altra strategia per eliminare la pausa). Fortunatamente Cocoa e Objective-C hanno strumenti abbastanza buoni per il threading, vedi NSOperationQueue per cominciare. Apple ha anche alcuni buoni documenti sull'ottimizzazione delle prestazioni, vedi questa domanda per informazioni pertinenti collegamenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top