Требуется шаблон дизайна / пример ссылки для сетевых подключений iPhone - PullRequest
1 голос
/ 05 февраля 2010

Извините, если это основной вопрос. Я гуглял, искал StackOverflow и часами просматривал пример кода и не нашел ничего удовлетворительного для моего уровня квалификации.

Я хочу что-то вроде шаблона проектирования для обработки сетевых функций в iPhone SDK. Я слышал о людях, использующих одноэлементный класс, но слышал, что есть лучшие способы асинхронных соединений. Будет ли NSOperation полезным? Я довольно новичок в объектно-ориентированном программировании, но мне нужно время от времени вызывать мой веб-сервер через HTTP для моего текущего приложения и надеюсь найти решение, которое легко можно использовать повторно.

Я просмотрел документы NSURLConnection и могу получить базовую функциональность, но структура программирования запутана, и я не уверен, как лучше ее организовать. Существует ли пример кода для этого, который разделяет эти функции на их собственный класс? Ссылка на пример, который делает это, будет принята с благодарностью! спасибо!

Ответы [ 2 ]

1 голос
/ 07 февраля 2010

Я уже давно занимаюсь этим же вопросом ...

  1. Если вы эффективно выполняете GET для простого ресурса и уверены, что ресурс всегда будет там и доступен, есть простой способ сделать это:

    NSURL *URL=[[NSURL alloc] initWithString:@"http://www.google.com/"l];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    //TODO This needs to have timeouts & such set up, maybe parallelism
    NSString *results = [[NSString alloc] initWithContentsOfURL :URL];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    

    Это ДЕЙСТВИТЕЛЬНО простой способ сделать это, но, как говорится в моем комментарии, не очень надежный или надежный.

  2. Несколько более надежный, но все же достаточно простой, заменяет строку NSString на:

    results = [[NSString alloc] initWithContentsOfURL:URL encoding:NSASCIIStringEncoding error:&err]; // possibly NSUnicodeStringEncoding
    if (err!=nil) NSLog(@"Error occurred: %@", [err localizedDescription]);
    

    Это, по крайней мере, скажет вам, если есть ошибка ...

  3. ASIHTTPRequest предоставляет множество полезных и полезных сетевых функций для работы с ресурсами через Интернет. http://allseeing -i.com / ASIHTTPRequest / - разработчик ОЧЕНЬ отзывчив в своей группе Google. Я действительно хотел использовать это, и могу вернуться к нему, когда / если он поддерживает аутентификацию SSL Client Certificate (именно этого требует мой проект).

  4. NSURLConnection, как описано выше - это то, что я сейчас использую в своем проекте. Я предполагаю, что это удовлетворит почти все потребности, но это (на мой взгляд) более сложно в использовании. И, честно говоря, у меня все еще есть небольшие проблемы, когда я думаю о том, как интегрировать асинхронную загрузку данных в мое приложение. Но если это сработает для вас - и, вероятно, сработает, Apple использует его во всех операционных системах и приложениях - это ваш лучший выбор!

1 голос
/ 05 февраля 2010

Один из возможных подходов - использовать NSURLConnection (как вы упомянули).

Внутри вашего .h файла:

NSMutableData *connectionData;

Также добавьте свойство для connectionData ...

Внутри вашего .m файла:

- (void)updateFromServer {
    // You might want to display a loading indication here...

    NSMutableData *connectionDataTemp = [[NSMutableData alloc] init];
    self.connectionData = connectionDataTemp;
    [connectionDataTemp release];

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL: your_url];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connection release];
    [request release];
}

#pragma mark -
#pragma mark NSURLConnectionDelegate

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Add the received bulk of data to your mutable data object
    [self.connectionData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // Use your data

    // If there is a loading indication displayed then this is a good place to hide it...
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    // Handle error

    // If there is a loading indication displayed then this is a good place to hide it...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...