2013-10-25 2 views
1

Я много огляделся и не могу найти правильный ответ на свои проблемы. На данный момент у меня есть сетевой движок, и я делегирую его с каждого из контроллеров представления для выполнения моей сетевой активности.Проблемы с несколькими NSURLConnection

Например, чтобы получить информацию о пользователе У меня есть метод, как это:

- (void) getUserDetailsWithUserId:(NSString*) userId 
{ 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@Details", kServerAddress]]]; 
    request.HTTPMethod = @"POST"; 

    NSString *stringData = [NSString stringWithFormat:@"%@%@", kUserId, userId]; 
    NSData *requestBodyData = [stringData dataUsingEncoding:NSUTF8StringEncoding]; 
    request.HTTPBody = requestBodyData; 

    NSURLConnection *conn = [[NSURLConnection alloc] init]; 
    [conn setTag:kGetUserInfoConnection]; 
    (void)[conn initWithRequest:request delegate:self]; 
} 

И когда я получаю данные в connectionDidFinishLoading, я получаю данные в NSDictionary и на основе тега я настроил для подключения, я передаю данные на нужный NSDictionary.

Это прекрасно работает. Но теперь мне требуется два запроса, идущих от одного и того же контроллера. Поэтому, когда я это делаю, данные смешиваются. Скажем, у меня есть соединение для поиска, и данные из деталей пользователя могут появиться, когда я выполняю поиск. Данные не назначаются справа NSDictionary на основе переключателя, который я делаю внутри connectionDidFinishLoading. Я использую один делегат для всего сетевого движка.

Я новичок в NSURLConnection, должен ли я настроить очередь или что-то еще? Пожалуйста помоги.

EDIT

Вот та часть, где я получаю данные в connectionDidFinishLoading:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    if ([connection.tag integerValue] == kGetUserDetails) 
     networkDataSource.userData = self.jsonDetails; 
    if ([connection.tag integerValue] == kSearchConnection) 
     networkDataSource.searchData = self.jsonDetails; 
} 

и после этого у меня есть случай, переключатель, который вызывает нужный делегат для требуемого контроллера представления.

ответ

3

Анил здесь вам нужно определить, для которых запросить вы получили данные, простой способ проверить это, как показано ниже,

- (void)connectionDidFinishLoading:(NSURLConnection *)conn 
{ 
    // Check URL value for request, url for search and user details will be different, put if condition as per your need. 
    conn.currentRequest.URL 
} 

Попробуйте использовать conn.originalRequest.URL это даст первоначальный запрос ,

+1

Это звучит неплохо. Я сделаю это. – Anil

+0

хорошо, дайте мне знать в случае возникновения каких-либо проблем. –

+0

Я пробовал то же самое. Но когда я отправляю запрос между ними, скажу, что я выполняю поиск по мере того, как данные пользователя загружаются (скажем, медленные скорости в Интернете), вызов пользовательских данных не продолжается. Происходит только поиск. – Anil

-2

Объявите две переменные NSURLConnection в файле .h.

NSURLConnection *conn1; 
NSURLConnection *conn2; 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ 

    if(connection == conn1){ 

    } 
    else if(connection == conn2){ 

    } 

} 
+1

Я не делаю то же самое? Я выделяю различные NSURLConnection для каждого соединения NSURLConnection * conn = [[NSURLConnection alloc] init]; – Anil

1

Вы можете сделать все возможное, чтобы выполнить свою задачу, как упомянуто другими, и это решит вашу проблему. Но если у вас еще много соединений, вам нужно изменить свой подход.

Вы можете создать подкласс класса NSOperation. Предоставьте все необходимые данные, такие как url ​​или любую другую информацию, которую вы хотите вернуть, когда задача выполнится, передав словарь или модель данных этому классу.

В методе Nsoperation ovewrite 'main' и начать соединение в этом методе, т.е. поместить все ваши NSURRequest-инструкции в этот метод. отправить звонок назад, когда загрузка закончится вместе с этой информацией dict.

Пункты, которые следует иметь в виду: создать экземпляр separte для его рабочего класса для загрузки evey и вызвать его «метод запуска».

Это будет выглядеть примерно так:

[self setDownloadOperationObj:[[DownloadFileOperation alloc] initWithData:metadataDict]]; 

    [_downloadOperationObj setDelegate:self]; 

    [_downloadOperationObj setSelectorForUpdateComplete:@selector(callBackForDownloadComplete)]; 

    [_downloadOperationObj setQueuePriority:NSOperationQueuePriorityVeryHigh]; 

    [_downloadOperationObj start]; 

metaDict будет содержать информацию о пользователе. В классе DownloadFileOperation вы перезаписать «главный» метод, как:

- (void)main { 
    // a lengthy operation 
    @autoreleasepool 
    { 
     if(self.isCancelled) 
      return; 

//  //You url connection code 
    } 
} 

Вы можете добавить эту операцию к NSOperationQueue, если вы хотите. Вам просто нужно добавить операцию в NSOperationQueue, и она вызовет ее метод start.

Смежные вопросы