Как реализовать делегирование вместо уведомления

#ios #objective-c #iphone #delegates

#iOS #objective-c #iPhone #делегаты

Вопрос:

## Сетевой класс

 -(void)getResponse:(NSString *)url{

    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
    [urlRequest setHTTPMethod:@"GET"];
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];

    NSURLSessionDataTask *task = [session dataTaskWithRequest: urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //check if we encountered an error
        if(error != nil){
            NSLog(@"%@", [error localizedDescription]);
        }else{
            //get and check the HTTP status code
            NSInteger HTTPStatusCode = [(NSHTTPURLResponse *)response statusCode];
            if (HTTPStatusCode != 200) {
                NSLog(@"HTTP status code = %ld", (long)HTTPStatusCode);
            }

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                if(data != nil){
                    NSError *parseError = nil;
                    NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:amp;parseError];

                    [[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadNotification"
                                                                        object:self
                                                                      userInfo:responseDictionary];
                    NSLog(@"The response is - %@",responseDictionary);


                }
            }];
        }
    }];


    [task resume];

}
  

ViewController

 -(void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notifyReload:) name:@"ReloadNotification" object:nil];
}
  

Здесь я сообщил viewcontroller, что ответ пришел с сервера, и, пожалуйста, отразите ответ на контроллере представления с помощью NSNOTIFICATION .На самом деле я хочу реализовать то же самое с помощью делегатов.Я начинающий программист и пытаюсь изучить делегаты, но не в состоянии понять концепции, пожалуйста, объясните с помощью кода, как одна и та же задача может быть выполнена с помощью делегатов.Заранее спасибо!

Комментарии:

1. Обратитесь — dzone.com/articles/do-not-publishcreating-your

Ответ №1:

Вы можете сделать это с помощью обратного вызова через блоки:

Объявленный метод с использованием блока :

 -(void)getResponse:(NSString *)url AndWithCallback:(void(^)(BOOL success, id responseObject))callback{
   if(data != nil){
       callback(YES,@"Your object");
   }
   else{
       callback(NO,@"pass nil");
   }
}
  

Вызвать метод :

 [self getResponse:@"" AndWithCallback:^(BOOL success, id responseObject) {
        NSLog(@"%@",responseObject);
    }];
  

Комментарии:

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

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

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