Функция реентранта Objective-C
Я довольно новичок в Objective C и столкнулся со следующей проблемой:
-(void) funcA
{
// array is NSMutableArray within class definition and initialised at alloc method
[array setLength:0];
...
// make search and delegate itself for callback to funcB
}
-(void) funcB:(NSData*) data
{
[array: appendData:data];
}
(void) funcC
{
//Finished collecting data
//Signal caller for funcA that all data is received.
}
Идея заключается в том, что funcA вызывается для подключения к серверу, который добавляет данные несколько раз, вызывая funcB, а затем, наконец, funcC, когда все данные отправляются. Хорошо.
У меня проблема в том, что funcA может вызываться несколько раз, что приводит к тому, что массив будет иметь длину 0, пока он находится в середине обработки старого запроса.
Теперь я попробовал [блокировку NSLock] в funcA и [разблокировку NSLock] в funcC, но затем вызов блокировки по второму запросу делает тупик. Я понимаю, что синхронизация - это еще один способ обойти это, но я видел только блок внутри функции.
Я обычно программирую на C, и я бы использовал pthread_mutex, но я хочу придерживаться obj C все время. Предполагая, что это разные потоки, но, похоже, это не так (из-за тупика).
Как я могу решить эту проблему?
Благодарю. Инди
1 ответ
Я полагаю, вы просто ищете замок для реентера. pthread_mutex
по умолчанию не является рекурсивным, но является опцией@synchronized
является рекурсивным NSLock
не является.
Если это ваша потребность, вы можете использовать NSRecursiveLock
,