2013-04-19 2 views
0

Я разрабатываю приложение iOS 5.0+ с последним SDK.NSCondition: подождите определенное количество времени

Это приложение является переносом из приложения для 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]; 

Чтение Java документации о wait(long), я прочитал это:

Вызывает текущий поток ждать, пока либо другой поток не вызывает метод Notify() или метод notifyAll() для этого объекта, или указанный количество времени истекло.

Я знаю, что может вызвать [uploadWorkerLock invoke] но как я могу имитировать, что определенного количества времени прошло.?

Кстати, этот код находится внутри NSThread selector.

+1

Ваша проблема в том, что вы должны выполнять гранулирование при переносе своего приложения. Вопрос, который вы должны задать, - «как загрузить файл?». Не пытайтесь переводить приложение по очереди. Пока мы это делаем. В общем избегайте 'NSThread'. GCD или NSOperation - это путь. –

+1

Также относится к портированию. Держитесь подальше от использования исключений для потока управления в Objective-C. Я знаю, что это так, как вы делаете это на Java, но Objective-C использует NSError и возвращает nil, когда есть ошибка ('nil' безопасен для сообщения, исключений с нулевым указателем в Objective-C нет). –

+0

Я думаю, что я не очень хорошо объяснил или не понял: этот код находится внутри потока на Android, и я портировал его в NSThread. Внутри андроидного потока у меня есть Object.wait, и я не знаю, как это сделать на iOS. – VansFannel

ответ

1

Если вы хотите сделать это просто, с синтаксисом подобным Java просто не запутаться, вот как это сделать:

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

Но это не единственный путь, @synchronized директива не так быстро, как прямая блокировка, или NSLock. Другой способ - GCD, который позволяет выполнять некоторые блоки кода (практически) одновременно. Это быстрее, чем использование отдельных потоков, поскольку оно будет пытаться оптимизировать вещи, и оно может запускать два отдельных блока кода в одном потоке, просто имитируя многопоточность, избегая при этом обмена контекстами, что дорого.

Также с GCD это не сложно, но для этого требуется некоторое знание блоков и вещей, которые могут быть немного грязными для тех, кто только что начал с Objective-C. Кроме того, GCD не заменяет многопоточность, когда у вас есть сложное приложение, и каждый поток не просто выполняет один блок кода, то более многопоточность будет более правильной.

+0

Большое спасибо за ваш вопрос. Это очень хорошо объяснено. У меня есть другой вопрос: как мне реализовать этот код внутри блока? Еще раз спасибо. – VansFannel

+0

Это зависит от того, что вам нужно сделать, этот код - это просто «перевод» того, что вы написали на Java. –