Domanda

Sono abbastanza nuovo nello sviluppo di iPhone ma sto per pubblicare la mia prima app (relativa a un sito Web che gestisco). L'app richiede un database molto grande e come tale ho deciso di archiviare localmente solo i dati più comunemente utilizzati, recuperando gli altri dati tramite una chiamata del servizio Web JSON dal database su cui il mio sito Web si avvia.

Mentre si esegue OK usando il simulatore (colpendo il DB live) le ricerche basate sulla chiamata al servizio web hanno richiesto più tempo di quanto avessi sperato che avrebbero funzionato al telefono. Queste chiamate sembrano molto peggiori rispetto alle ricerche native che sono istantanee. Per ridurre la differenza relativa, volevo inserire un falso interstiziale (pagina con indicatore di attività) per le ricerche native (le ricerche del servizio Web ne utilizzano già una) ma ho avuto un problema con i tempi dei push del controller di navigazione quando combinato con sleep (n).

Ad ogni modo, la sezione di ricerca della mia app è un navController con una scheda tabController. Quando si tenta di utilizzare il codice in questo modo:

[[tabBarController.viewControllers objectAtIndex:0] pushViewController:(UIViewController *)waitingController animated:YES];
sleep(2);

Trovo che il push aspetti sempre che il sonno finisca prima di essere eseguito quando l'effetto che desidero è che il viewcontroller venga premuto e quindi l'app aspetti due secondi prima di continuare a simulare il processo di ricerca.

Ho avuto altri strani risultati con i push di navController, in alcune occasioni ho sperimentato quello che sembra essere un miscuglio di due viewcontroller separati quando quello che ho spinto come interstiziale rimane al suo posto solo per il contenuto il titolo di quello che voglio inserire è il suo posto rimanente.

Sono sicuro che ci sia una fondamentale mancanza di comprensione da parte mia, quindi spero in un po 'di guida qui.

Saluti,

Alan.

È stato utile?

Soluzione

sleep (float) blocca il thread principale causando il blocco dell'interfaccia utente. Dovresti invece programmare alcune azioni da eseguire in seguito utilizzando - [NSObject performSelector: withObject: afterDelay:]

Esempio:

[label performSelector:@selector(setText:) withObject:@"Delayed Hello World!" afterDelay:2.0f];

Altri suggerimenti

Vorrei cambiare la tua architettura e non dormire sul thread principale, non una grande esperienza utente!

Cerca di utilizzare NSOperation per controllare le tue interazioni con il servizio Web: ciò ti consentirà di mettere in coda le operazioni e di eseguirle in una sequenza specifica o in parallelo.

NSOperation è un modo molto semplice per fornire robuste operazioni di threading e potresti scegliere di richiamare il thread principale con tutti gli aggiornamenti che vuoi fare lungo il percorso.

Penso che questa architettura ti aiuterà a rendere l'interfaccia utente molto migliore - ma una volta riconfigurata la tua idea di usare le operazioni troverai molti altri vantaggi.

NB: Mi ci sono volute alcune volte per fare i conti con NSOperation e NSOperationQueue - ma il tempo che ho investito ne è valsa decisamente la pena.

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