开发者

synchronize background jobs in UIImageView

开发者 https://www.devze.com 2023-03-16 00:56 出处:网络
I have an interface defined like this @interface PageViewController : UIImageView { ... } -(void) setImageUsing:(id) obj;

I have an interface defined like this

@interface PageViewController : UIImageView {
...
}

-(void) setImageUsing:(id) obj;

@end

and implementation is like the following

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

setImageUsing is called from other code as result of user interactions with the application.

How should I proceed to limit PageViewController to only one background job at a time?

In other words, I would like to cancel any running background job when a new call to setImageUsing is made and start a new background job after that.

EDIT/SOLUTION:

As Ishu proposed, I tried to use NSLock for synchronization purposes. The final code (that solved the issue) looks like this:

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

    BOOL m_cancelThread;
}

-(void) setImageUsing:(id) obj;

@end

and implementation is like the following

    -(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];
        ....
   开发者_如何学C     if (m_cancelThread)
        {
           // cancel 
        }
        ...
        m_cancelThread = NO;
        [m_threadLock unlock];
     }

Hope it'll help someone else.


This is not good way to terminate any background task , competing the background thread execution is good see this thread. What you need , you need to lock an thread allocation for some kind of mishappenings. See NSLocks in developer documentation and some googling gives you some info about NSLock.

0

精彩评论

暂无评论...
验证码 换一张
取 消