0

我正在使用最新的 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.

4

1 回答 1

1

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

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

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

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

于 2013-04-19T12:55:48.583 回答