我正在使用最新的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
。
答案 0 :(得分:1)
如果你想简单地使用类似于Java的语法,只是为了不让人感到困惑,那就是如何做到这一点:
@synchronized(uploadWorkerLock)
{
usleep(UPLOAD_WORKER_SLEEP_TIME*1000);
}
但这不是唯一的方法, @synchronized 指令没有自旋锁或 NSLock 那么快。另一种方法是GCD,它允许您同时执行某些代码块(虚拟)。它比使用单独的线程更快,因为它会尝试优化事物,并且它可以在同一个线程中运行两个独立的代码块,只是模拟多线程,因此避免了昂贵的上下文交换。
同样使用GCD并不难做到,但它需要一些额外的块和事物知识,对于刚刚开始使用Objective-C的人来说可能有点混乱。此外,GCD不能替代多线程,当你有一个复杂的应用程序而且每个线程不只是执行一个代码块时,普通的多线程会更合适。