2012-03-30 5 views
5

Quiero crear un subproceso de trabajo que no es el hilo principal para que pueda llamar ...¿Cómo se crea un NSThread que no es el hilo principal sin realizar un selector de inmediato

[self performSelector:@selector(doStuff) OnThread:self.myWorkerThread withObject:nil]; 

. .. en un montón de lugares en mi código. ¿Cómo creo un hilo ... cualquier hilo y lo asigno a una variable para que pueda usarlo una y otra vez en mi código? NSThread detachNewThreadWithSElector solo creará uno con el fin de ejecutar ese único selector. Necesito crear un hilo y usarlo de alguna manera.

Estoy usando iOS y necesito realizar todas mis escrituras de CoreData en un writerThread. Necesito usar el mismo hilo (que no es el principal) cada vez.

Respuesta

4

Recomiendo encarecidamente buscar en Grand Central Dispatch en su lugar :). Puede crear fácilmente una cola de envío a través de dispatch_queue_create u obtener uno de los subprocesos concurrentes existentes y enviar lo que desee. Se va a crear el número apropiado de hilos según el estado de carga de trabajo/OS, etc. Se parece a esto:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ 
    //Do stuff 
}); 

O usted puede mirar en su contraparte NS, NSOperation. No sé de una manera de hacer esto con solo NSThread. Parece que la única forma de configurar su selector es iniciarlo con uno.

EDITAR Si sólo desea un hilo, simplemente llame [[NSThread alloc] init]: p

hacer otras modificaciones: iPhone: how to use performSelector:onThread:withObject:waitUntilDone: method?

Según esta respuesta, que va a ser difícil de configurar, ya que cada hilo necesita una función "principal" en el momento en que se creó o de lo contrario no hará nada ...

+0

gracias por this..I've actualizan mi pregunta con más detalles. –

+0

He actualizado mi respuesta – borrrden

+0

si performSelectorWithThread: [NSThread TrenzadoPrincipal] funciona bien, pero performSelectorWithThread: [[alloc NSThread] init], se congela y no hace nada :(.. He intentado llamar 'inicio' después de él, pero allocing no hace nada nuevo en –

2

Parece que la forma más fácil sería usar bloque s:

void (^now)(void) =^{ 
    NSDate *date = [NSDate date]; 
    NSLog(@"The date and time is %@", date); 
}; 

y llame:

now(); 

NSBlockOperation o dispatch_async().

Ver más aquí: http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

+0

estoy en iOS ... ¿no son solamente mac –

+1

no hay bloques se utilizan en iOS SDK lo que está usando ellos son compatibles?.? en 4 y 5. –

1

Si usted está haciendo específicamente este para interactuar con la base de datos (como su pregunta sugiere), y se puede requerir iOS 5 para su aplicación, es posible que desee investigar la nueva cola privada contexto de objetos administrados agregado en iOS 5. Crea y administra la cola de subprocesos/despachos por usted, y usted le envía bloques para que se ejecuten en la cola como una forma de interactuar con ellos. Vea the release notes y WWDC session video para más detalles.

Actualización (mayo de 2016): la nueva API agregada en iOS 5 era -[NSManagedObjectContext initWithConcurrencyType:]. A partir de iOS 9, el inicializador más antiguo ha quedado en desuso, junto con el tipo de simultaneidad de confinamiento que había sido el predeterminado antes de la introducción de los tipos de simultaneidad basados ​​en colas. Entonces, si no está utilizando colas para administrar el acceso al contexto, le recomiendo encarecidamente avanzar en esa dirección.

También recomendaría encarecidamente using the com.apple.CoreData.ConcurrencyDebug launch argument durante su desarrollo, con el fin de ayudarlo a alcanzar lugares donde está infringiendo las reglas.

+0

muy interesante -. gracias –

+0

enlace está muerto -. es por eso que debe incluir algún contenido desde el enlace en su respuesta –

2

Si realmente quiere esto y no usar GCD, entonces:

NSThread *thr = [[NSThread alloc] initWithTarget:anobject selector:@selector(doStuff) object:nil]; 

Y esto llamará al método apropiado en el objeto cuando lo desee - sin embargo, me parece que la aplicación actual de NSThread doesn no permite cambiar el objetivo y el selector.

+0

Eso es imposible por lo que quiero que escribo periódicamente a información básica y yo quiero hacer. esto en un hilo designado (al inicio) para que no tenga que tener múltiples NSManagedObjectContexts, así que debo realizarSelectOnThread:

+0

faltante: \t [thr start]; :) – ingconti

Cuestiones relacionadas