Objective-C Language
Multihilo
Buscar..
Creando un hilo simple
La forma más sencilla de crear un hilo es llamando a un selector "en el fondo". Esto significa que se crea un nuevo hilo para ejecutar el selector. El objeto receptor puede ser cualquier objeto, no solo self
, sino que debe responder al selector dado.
- (void)createThread {
[self performSelectorInBackground:@selector(threadMainWithOptionalArgument:)
withObject:someObject];
}
- (void)threadMainWithOptionalArgument:(id)argument {
// To avoid memory leaks, the first thing a thread method needs to do is
// create a new autorelease pool, either manually or via "@autoreleasepool".
@autoreleasepool {
// The thread code should be here.
}
}
Crear hilo más complejo.
El uso de una subclase de NSThread
permite la implementación de subprocesos más complejos (por ejemplo, para permitir pasar más argumentos o para encapsular todos los métodos de ayuda relacionados en una clase). Además, la instancia de NSThread
se puede guardar en una propiedad o variable y se puede consultar sobre su estado actual (si todavía se está ejecutando).
La clase NSThread
admite un método llamado cancel
que se puede llamar desde cualquier subproceso, que luego establece la propiedad cancelled
en YES
de una manera segura para subprocesos. La implementación del hilo puede consultar (y / u observar) la propiedad cancelled
y salir de su método main
. Esto se puede utilizar para cerrar con gracia un subproceso de trabajo.
// Create a new NSThread subclass
@interface MyThread : NSThread
// Add properties for values that need to be passed from the caller to the new
// thread. Caller must not modify these once the thread is started to avoid
// threading issues (or the properties must be made thread-safe using locks).
@property NSInteger someProperty;
@end
@implementation MyThread
- (void)main
{
@autoreleasepool {
// The main thread method goes here
NSLog(@"New thread. Some property: %ld", (long)self.someProperty);
}
}
@end
MyThread *thread = [[MyThread alloc] init];
thread.someProperty = 42;
[thread start];
Almacenamiento de hilo local
Cada hilo tiene acceso a un diccionario mutable que es local al hilo actual. Esto permite almacenar información en caché de una manera fácil sin la necesidad de bloquear, ya que cada hilo tiene su propio diccionario mutable dedicado:
NSMutableDictionary *localStorage = [NSThread currentThread].threadDictionary;
localStorage[someKey] = someValue;
El diccionario se libera automáticamente cuando el hilo termina.