miércoles, 27 de enero de 2016

iOS: Semaphore, Locks, Multithreading

Semaphore

static dispatch_semaphore_t newAgent;

newAgent = dispatch_semaphore_create(0);

dispatch_semaphore_signal(newAgent);

dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kWaitForNewAgents * NSEC_PER_SEC));

dispatch_semaphore_wait(newAgent, timeout);


dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

Lock

static NSLock *agentLock;

agentLock = [[NSLock alloc]init];

[agentLock lock];

[agentLock unlock];


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
});

Create own queue:

dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);

dispatch_async(myQueue, ^{
    // Perform long running process
   
    dispatch_async(dispatch_get_main_queue(), ^{
        // Update the UI
       
    });
});

Groups

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    // block1
    NSLog(@"Block1");
    [NSThread sleepForTimeInterval:5.0];
    NSLog(@"Block1 End");
});


dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    // block2
    NSLog(@"Block2");
    [NSThread sleepForTimeInterval:8.0];
    NSLog(@"Block2 End");
});

dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0*), ^ {
    // block3
    NSLog(@"Block3");
});

Common usage

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0*), ^(void){
    //Background Thread
    dispatch_async(dispatch_get_main_queue(), ^(void){
        //Run UI Updates
    });

});

*Can be either 0 (or NULL), DISPATCH_QUEUE_CONCURRENT or DISPATCH_QUEUE_SERIAL.

No hay comentarios:

Publicar un comentario