Domanda

Nella mia applicazione basata su documenti, ho sovrascritto il metodo OpenDocument: nella mia sottoclasse di NSDocumentController in modo da poter visualizzare il mio OpenPanel. Passo gli URL scelti al metodo opendocumentwithcontententll: display: CompletamentoHandler:. Io uso questo codice per la chiamata:

[self openDocumentWithContentsOfURL:[chosenFiles objectAtIndex:i] display:YES completionHandler:^(NSDocument *document, BOOL documentWasAlreadyOpen, NSError *error) {

    if (document == nil)
    {
        NSAlert* alert = [NSAlert alertWithError:error];
        [alert runModal];
    }

}];
.

Quindi voglio visualizzare l'errore superato se Nil viene restituito come riferimento al documento. Il problema è che il programma semplicemente "si congela" dopo aver premuto il pulsante "Apri" nel pannello aperto. Quindi ho bisogno di interrompere manualmente il programma con il pulsante "Stop" in Xcode. Sembra che nessun pallone da spiaggia di filatura appare. Se commento alla riga "[Alert RunModal]", il programma non congela più, ma non viene visualizzato alcun avviso, ovviamente.

Ora la cosa strana: il codice funziona a volte . Se passerò da xcode al mio browser e indietro e eseguo di nuovo il programma, a volte funziona perfettamente e viene visualizzato l'errore. Dopo un po 'di tempo smette di lavorare di nuovo. È imprevedibile, ma la maggior parte delle volte non funziona.

Tutto questo suona come una conversione a me. Certamente ha qualcosa a che fare con il blocco? Ma cosa faccio male?

È stato utile?

Soluzione

Conversione del mio commento a una risposta:

rundolodella sul filo principale.

[alert performSelectorOnMainThread:@selector(runModal) withObject:nil waitUntilDone:NO]; 
.

Penso che il rundolodel debba essere chiamato sul thread principale perché fa parte del Quadro Appkit, ed è attivamente attivando la grafica UI.Credo che tutte le chiamate al framework Appkit oa qualsiasi metodo che manipola la grafica deve essere sul filo principale.

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