Асинхронный обратный вызов для сети в Objective-C Iphone - PullRequest
0 голосов
/ 11 мая 2010

Я работаю с сетевым запросом - ответ в Objective-C. В асинхронной модели есть что-то, чего я не понимаю.

Таким образом, у меня есть вид, который покажет мои статусы из 2 социальных сетей: Twitter и Facebook. Когда я нажму кнопку «Обновить», он вызовет менеджер моделей. Менеджер этой модели вызовет 2 сервисных помощников для запроса последних товаров. Когда 2 сервисных помощника получают данные, они передаются обратно менеджеру модели, и эта модель добавляет все данные в отсортированный массив.

Что я не понимаю, так это то, что: когда ответ из социальных сетей возвращается, сколько потоков будет обрабатывать ответ. Исходя из моего понимания многопоточности и работы в сети (в Java), 2 потока обрабатывают 2 ответа, и эти 2 потока выполнят код для добавления ответов в массив. Таким образом, это может иметь состояние гонки и программа может пойти не так, не так ли? Это правильная рабочая модель iphone target-C? Или они делают это по-другому, так что у него никогда не будет состояния гонки, и нам не нужно заботиться о блокировке, синхронизации?

Вот мой пример кода:

ModelManager.m

- (void)updateMyItems:(NSArray *)items {
    self.helpers = [self authenticatedHelpersForAction:NCHelperActionGetMyItems];
    for (id<NCHelper> helper in self.helpers) {
        [helper updateMyItems:items]; // NETWORK request here
    }
}

- (void)helper:(id <NCHelper>)helper didReturnItems:(NSArray *)items {
     [self helperDidFinishGettingMyItems:items callback:@selector(model:didGetMyItems:)];
         break;                     
    }
}

// some private attributes
int *_currentSocialNetworkItemsCount = 0; // to count the number of items of a social network
- (void)helperDidFinishGettingMyItems:(NSArray *)items {
        for (Item *item in items) {
            _currentSocialNetworkItemsCount ++;
        }            
        NSLog(@"count: %d", _currentSocialNetworkItemsCount);
        _currentSocialNetworkItemsCount = 0;
}

Я хочу спросить, есть ли случай, когда метод helperDidFinishGettingMyItems вызывается одновременно. Это означает, что, например, faceboook возвращает 10 элементов, твиттер возвращает 10 элементов, будет ли когда-нибудь результат счета больше 10?

И если существует только один отдельный поток, как поток может завершить синтаксический анализ ответа 1 и перейти к другому ответу, потому что, IMO, поток выполняется только последовательно, блок кода за блоком кода

1 Ответ

1 голос
/ 11 мая 2010

Да, возможно, существует поток для каждого сетевого запроса.Хитрость заключается в обработке ответа в основном потоке.У вас должно быть что-то вроде этого:

- (void)helper:(id <NCHelper>)helper didReturnItems:(NSArray *)items;
{
    [self performSelectorOnMainThread:@selector(helperDidFinishGettingMyItems:)
                           withObject:items
                        waitUntilDone:NO];
}

Помещение ответа обратно в основной поток позволит избежать целого ряда проблем многопоточности.

Кроме того, вывод количества никогдабыть больше 10. Просто несколько потоков могут запускаться helperDidFinishGettingMyItems: одновременно.Они не будут автоматически объединять два массива.

Счетчик может быть больше 10, потому что несколько потоков могут увеличивать этот ивар одновременно.

...