синхронизировать фоновые задания в UIImageView - PullRequest
1 голос
/ 27 июня 2011

У меня определен интерфейс, подобный этому

@interface PageViewController : UIImageView {
...
}

-(void) setImageUsing:(id) obj;

@end

, а реализация похожа на следующую

-(void) setImageUsing:(id) obj
{
    ...
    [self performSelectorInBackground:@selector(changeImage) withObject:nil];
}

setImageUsing вызывается из другого кода в результате взаимодействия пользователя с приложением,

Как мне перейти к ограничению PageViewController только одним фоновым заданием за раз?

Другими словами, я хотел бы отменить любое фоновое задание при новом вызове setImageUsing сделано и запустите новое фоновое задание после этого.

РЕДАКТИРОВАНИЕ / РЕШЕНИЕ :

Как предложил Ишу, я попытался использовать NSLock для целей синхронизации.Окончательный код (который решил проблему) выглядит следующим образом:

@interface PageViewController : UIImageView {
    ...
    NSLock* m_threadLock;
    NSLock* m_externalLock;

    BOOL m_cancelThread;
}

-(void) setImageUsing:(id) obj;

@end

, а реализация выглядит следующим образом:

    -(void) setImageUsing:(id) obj
    {
        [m_externalLock lock];
        ...
        if ([m_threadLock tryLock])
        {
            // succeeded in locking thread lock. so there is no background job running.
            // unlock the lock and continue
            [m_threadLock unlock];
        }
        else
        {
            // failed to lock thread lock. so there IS a job already running.
            // ask the job to cancel
            m_cancelThread = YES;
        }

        [self performSelectorInBackground:@selector(changeImage) withObject:nil];
        [m_externalLock unlock];
    }

    -(void) changeImage
    {
        [m_threadLock lock];
        ....
        if (m_cancelThread)
        {
           // cancel 
        }
        ...
        m_cancelThread = NO;
        [m_threadLock unlock];
     }

Надеюсь, это поможет кому-то еще.

1 Ответ

0 голосов
/ 27 июня 2011

Это не хороший способ завершить любую фоновую задачу, конкурирующее выполнение фонового потока хорошо, см. Этот поток .Что вам нужно, вам нужно заблокировать распределение потоков для каких-то несчастных случаев.См. NSLocks в документации для разработчиков, и некоторые поиски в Google дают вам некоторую информацию о NSLock.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...