NSURLConnection. Мне нужна помощь в сохранении полученных данных - PullRequest
0 голосов
/ 22 сентября 2011

Я запускаю NSURLConnection и мне нужно сохранить данные, полученные из интернета. В - (void)connectionDidFinishLoading:(NSURLConnection *)connection Мне нужно сохранить данные с другим именем, используя исходный URL в качестве имени данных ... Как получить эту информацию (URL) в connectionDidFinishLoading с помощью асинхронного запроса? Если это невозможно, можете ли вы предложить мне другие способы сделать то, что я просил? Спасибо Paolo

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

** Ответ действителен только до iOS5. Начиная с iOS5, Apple представила метод -originalRequest, который позволяет избежать дальнейшего подкласса для этой специальной цели. В общем, Apple представила класс NSURLConnection так много улучшений, что больше не нужно создавать подкласс NSURLConnection, если не требуется нетривиальное поведение ** Вы можете создать подкласс NSURLConnection, добавив дополнительное свойство с именем

NSURL <em>originalURL
и затем запустив его. Когда выполняется метод завершения делегата, вы можете получить это свойство и выполнить оставшуюся часть работы. *

например. (Я покажу соответствующие части, не копируйте и не вставляйте, пожалуйста):

MyURLConnection.h<br><br>
<code>
@interface MyURLConnection:NSURLConnection {
  @property (nonatomic,retain) NSURL *originalURL;
}
@end
</code>

MyURLConnection.m<br><br>
<code>
@implementation MyURLConnection 

@synthesize originalURL;
</code>

In your calling class:<br><br>

<code>
MyURLConnection *myConnection = [[MyURLConnection alloc] initWithRequest:myRequest delegate:myDelegate];
myConnection.originalURL = [request URL];
[myConnection start];
</code>

and finally in the delegate:

<code>
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
  MyURLConnection *myConn = (MyURLConnection)connection;
  NSURL *myURL = myConn.originalUrl;
  // following code

}
</code>
1 голос
/ 22 сентября 2011

* ТЕПЕРЬ Библиотека ASIHTTPRequest больше не поддерживается автором, поэтому неплохо бы начать использовать некоторые другие библиотеки *

Я бы предложил вам использовать ASIHTTP-запрос .Я давно этим пользуюсь.Приведенный ниже пример кода предназначен для асинхронной загрузки данных из URL.

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}

ОБНОВЛЕНИЕ:

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setCompletionBlock:^{
      // Use when fetching text data
      NSString *responseString = [request responseString];

      // Use when fetching binary data
      NSData *responseData = [request responseData];

      //here you have access to NSURL variable url.
   }];
   [request setFailedBlock:^{
      NSError *error = [request error];
   }];
   [request startAsynchronous];
}

Попробуйте использовать GCD в ASIHTTP.Здесь внутри блока вы будете иметь доступ к переменной url.

...