2012-04-10 3 views
0

В проекте Xcode у меня есть 2 класса: ParentViewController и еще один класс ChildViewController, который является подклассом ParentViewController. В классе ParentViewController мы используем NSURLConnection, didReceiveData и connectionDidFinishLoading для получения некоторых данных с сервера задней части. Он отлично работает. Теперь в моем ChildViewController мне нужно сделать соединение и получить данные из бэкэнда. Но если я добавлю didReceiveData и connectionDidFinishLoading в ChildViewController, то didReceiveData в ParentViewController похоже не работает. Мне интересно, почему?didReceiveData Over write in subclass

Также кажется, что у меня есть много разных запросов, отправляемых на сервер, поэтому моии connectionDidFinishLoading переполнены операциями (connect == someConnection). Мне интересно какой-нибудь опрятный способ справиться с этой ситуацией? Благодарю.

ответ

0

Подкласс наследует методы делегирования соединений ParentViewController. Если вы хотите иметь такое же поведение в подклассе, просто не выполняйте там методы делегата.

Другая идея заключается в том, чтобы избежать методов делегата в целом. В iOS5, то NSURLConnection обеспечивает лучший способ, чтобы начать соединение, используя блок для завершения, так что ваш код для каждого соединения может находиться в контексте, а именно:

NSURLRequest *requestA = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http..."]]; 
[NSURLConnection sendAsynchronousRequest:requestA queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    // do what you need to do when requestA completes 
}]; 

NSURLRequest *requestB = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http..."]]; 
[NSURLConnection sendAsynchronousRequest:requestA queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    // do what you need to do when requestB completes 
}]; 

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

0

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

Переместите все данные, полученные в объекты модели. Когда контроллерам вида что-то нужно, они могут запросить загрузку модели. Затем, даже если контроллер просмотра выходит за пределы экрана, модель все равно может корректно обновляться и позволяет контроллерам представления знать, когда это будет сделано.

Обычно для каждого соединения может быть один объект модели. Например, если я обновляю запись человека из базы данных сервера, объект Person будет запрашивать собственные данные. Тогда это connectionDidFinishLoading будет иметь дело только с одним соединением.

Возможно, вы захотите разместить свои соединения, хотя центральная очередь (например, NSOperationQueue), чтобы вы могли избежать подавления сетевого соединения с запросами. Но делегат для каждого соединения был бы соответствующим объектом модели, а не контроллером представления.