Расширение протокола для расширения методов делегирования для NSURLConnection - PullRequest
0 голосов
/ 30 ноября 2011

Я пытаюсь перезаписать NSURLConnection Delegate, но я не знаю, с чего начать, может кто-нибудь дать какую-то дополнительную информацию и небольшой пример кода?

Я хочу расширить делегат connectionDidFinishLoading.И продолжайте искать, если JSON-String, к которой я возвращаюсь, получил сообщение об ошибке для пользователя.

Мне кажется, это лучший способ расширить делегат.Это вообще возможно?

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

Расширение протокола позволит вам добавлять методы к нему.Однако, если вы добавите больше методов к <NSURLConnectionDelegate>, это не будет означать, что NSURLConnection s будет использовать их:)

Почему вы не можете поместить свой код проверки ошибок в свой метод connectionDidFinishLoading

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // Check your json here
}
1 голос
/ 30 ноября 2011

Если я правильно понял, что вы пытаетесь достичь, это следующее:

  • Создайте NSURLConnection и настройте его для получения файла JSON.
  • Когда соединениезавершите, проверьте, является ли полученный файл удовлетворительным.
  • Если файл не является удовлетворительным, тогда предупредите пользователя.

Если мое понимание правильное, вам не нужно расширятьпротокол NSURLConnectionDelegate.Все, что вам нужно сделать, это реализовать NSURLConnectionDelegate.Шаблон делегата позволяет изменить поведение класса.(В других языках / платформах поведение, которое вы объяснили, будет реализовано с помощью подклассов. Класс URL-соединения будет разделен на подклассы, а методы и переопределены для изменения поведения.) Это может стоить того, чтобы вы прочитали Шаблоны проектирования какао .

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

@interface SOViewController : UIViewController <NSURLConnectionDelegate> //this simply tells the compiler that SOViewController implements the NSURLConnectionDelegate protocol. If you excluded you will get a compiler warning but the code will behave correctly. You should include it.
//...
@property(readwrite, nonatomic, retain) NSURLConnection *connection;
@property(readwrite, nonatomic, retain) NSMutableData *data;
@end

@implementation SOViewController

//...

-(void)setupJSONFetch:(NSURL *)url
{
    NSURLRequest *request = [NSURLRequest requestWithURL: url]; //create a request
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; //create a connection and set self as the delegate
    self.connection = connection;  //keep a reference to the connection
    self.data = [NSMutableData data]; //create an object to store the downloaded data
    [connection start]; //go!
}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //store the downloaded data
    [self.data appendData: data];
}

- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL
{
     //Check self.data is as expected
}

//...

@end

Стоит также отметить, что методы делегата NSURLConnection были реорганизованы в iOS 5.

0 голосов
/ 30 ноября 2011

В вашем .h файле: -

@interface YourViewController : UIViewController<YourDelegate>{

}
@end

В вашем .m файле: -

Реализуйте методы: -

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [connection release];
    self.responseData = nil;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [connection release];


}

Я думаю эта ссылка может помочь вам ...:)

...