Функция реентранта 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,

Другие вопросы по тегам