Некоторое время я пользовался многопоточностью, думал, что получил, но моя программа сейчас падает.
У меня есть метод, который должен загружать данные для сервера и получать доступ к памяти в зависимости от данных,этот процесс занимает много времени, поэтому я выполняю его из вторичного потока следующим образом:
-(void)showPeople{
dispatch_queue_t pintaOcupantes = dispatch_queue_create("Pinta Ocupantes", NULL);
dispatch_async(pintaOcupantes, ^{
//BUNCH OF CODE
[self isPersonIn:jid];
//MORE CODE that include methods calling isPersonIn
});
Внутри этого блока находится isPersonIn.Он вылетает, если я слишком быстро нажимаю кнопку, которая выполняет showPeople.IsPersonIn выглядит примерно так:
-(int)isPersonIn:(XMPPJID *)jid{
int i = 0;
for(NSDictionary *card in self.listaGente){
NSLog(@"la jid es: %@", [card objectForKey:@"jid"]);
NSLog(@"la jid del usuario es: %@", jid.user);
if([[card objectForKey:@"jid"] isEqualToString:jid.user]){
return i;
}
i++;
}
return -1;
}
Он сравнивает XMPPJID с массивом, который является переменной экземпляра.isPersonIn вызывается несколько раз из разных методов, но все методы, которые вызывают его, принадлежат блоку, так что, как я понимаю, все выполнения isPersonIn должны быть сериализованы, FIFO, верно?
Но если я нажму клавишуКнопка, которая выполняет showPeople, та, которая содержит блок, много раз очень быстро, приложение падает на isPersonIn, иногда без какого-либо сообщения.Я могу видеть потоки, когда он падает, и я вижу, по крайней мере, 2 потока с isPersonIn последними в стеке, что не имеет смысла, так как блок должен выполняться по одному, а не несколько потоков одновременно, верно?
Любая помощь будет очень сильно оценена.
Спасибо!
[EDIT] Кроме того, массив экземпляра self.listaGente изменяется вне блока.