NSCondition:等待指定的时间

时间:2013-04-19 12:32:25

标签: ios objective-c synchronization

我正在使用最新的SDK开发iOS 5.0+应用程序。

此应用是从Android应用迁移的。

在Android应用中,我有以下代码:

private Object uploadWorkerLock = new Object();
private static final int UPLOAD_WORKER_SLEEP_TIME = 30000;

[ ... ]

synchronized (ServerManager.this.uploadWorkerLock) {
    try {
        ServerManager.this.uploadWorkerLock.wait(UPLOAD_WORKER_SLEEP_TIME);
    } catch (InterruptedException e) {
        return;
    }
}

我对void java.lang.Object.wait(long millis)有疑问。我可以这样迁移代码:

NSCondition * uploadWorkerLock;

[ ... ]
[uploadWorkerLock lock];
[uploadWorkerLock wait];
[uploadWorkerLock unlock];

阅读关于wait(long)的Java文档,我读过这个:

导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或者已经过了指定的时间量。

我知道我可以调用[uploadWorkerLock invoke]如何模拟指定的时间已过去。

顺便说一句,此代码位于NSThread selector

1 个答案:

答案 0 :(得分:1)

如果你想简单地使用类似于Java的语法,只是为了不让人感到困惑,那就是如何做到这一点:

@synchronized(uploadWorkerLock)
{
    usleep(UPLOAD_WORKER_SLEEP_TIME*1000);
}

但这不是唯一的方法, @synchronized 指令没有自旋锁或 NSLock 那么快。另一种方法是GCD,它允许您同时执行某些代码块(虚拟)。它比使用单独的线程更快,因为它会尝试优化事物,并且它可以在同一个线程中运行两个独立的代码块,只是模拟多线程,因此避免了昂贵的上下文交换。

同样使用GCD并不难做到,但它需要一些额外的块和事物知识,对于刚刚开始使用Objective-C的人来说可能有点混乱。此外,GCD不能替代多线程,当你有一个复杂的应用程序而且每个线程不只是执行一个代码块时,普通的多线程会更合适。