обработчик завершения цели c

У меня есть класс RequestManager с функциями getContentInBackgroundWithMemberId и postRequest. Я хочу вызвать их из моего контроллера представления и получить результат, используя обработчик завершения. Как редактировать мои функции?

RequestManager.h

#import <Foundation/Foundation.h>

@interface RequestManager : NSObject

-(void)getContentInBackgroundWithMemberId:(int)memberId;

@end

RequestManager.m

#import "RequestManager.h"

@implementation RequestManager


-(void)postRequestWithParams:(NSDictionary*)params
{
NSString *parameters = @"encrypt=93mrLIMApU1lNM619WzZje4S9EeI4L2L";
for(id key in params)
{
   NSString *obj = [NSString stringWithFormat:@"&%@=%@",key,[params objectForKey:key]];
   [parameters stringByAppendingString:obj];
}

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"http://someserver"]];

NSData *postBody = [parameters dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postBody];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    if(!connectionError)
    {
        NSDictionary *serverData =[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSArray *result = [NSArray array];
        result = [serverData objectForKey:@"result"];
    }

}];
}


-(void)getContentInBackgroundWithMemberId:(int)memberId
{
NSDictionary *params = [NSDictionary dictionary];
params = @{@"member_id":[NSNumber numberWithInt:memberId]};

[self postRequestWithParams:params];
}

@end

ViewController.h

#import <UIKit/UIKit.h>
#import "RequestManager.h"

@interface ViewController : UIViewController

@property (strong,nonatomic) RequestManager *requestManager;

@end

ViewController.m

#import "ViewController.h"

@interface ViewController

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

int memberId = 82;

//here i want to call getContentInBackgroundWithMemberId and get result using completion handler;
_requestManager = [[RequestManager alloc]init];
[_requestManager getContentInBackgroundWithMemberId:memberId];

}

@end

person Denis Windover    schedule 04.03.2017    source источник


Ответы (1)


RequestManager.h

@interface RequestManager : NSObject
    //Create a block property
    typedef void(^postRequestBlock)(BOOL status);

    -(void) getContentInBackgroundWithMemberId: (int) memberId completed:(postRequestBlock)completed;
@end

RequestManager.m

-(void) getContentInBackgroundWithMemberId: (int) memberId completed:(postRequestBlock)completed{
    NSDictionary * params = [NSDictionary dictionary];
    params = @ {
        @ "member_id": [NSNumber numberWithInt: memberId]
    };
    [self postRequestWithParams: params completed:^(BOOL status){
        completed(status);
    }];
}

//Add completion block.
-(void) postRequestWithParams: (NSDictionary * ) params completed:(postRequestBlock)completed{
    [NSURLConnection sendAsynchronousRequest: request queue: [NSOperationQueue mainQueue] completionHandler: ^ (NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        if (!connectionError) {
            NSDictionary * serverData = [NSJSONSerialization JSONObjectWithData: data options: 0 error: nil];
            NSArray * result = [NSArray array];
            result = [serverData objectForKey: @ "result"];
            completed(YES);
        } else {
            completed(NO);
        }

    }];
}

Уже есть тонны вопросов и ответов для блоков. Вот один из них, который может помочь в дальнейшем объяснении как написать блок завершения Objective-C

person Teffi    schedule 04.03.2017
comment
спасибо и какой синтаксис, когда я вызываю его из контроллера представления? - person Denis Windover; 04.03.2017
comment
@ДенисВиндовер getContentInBackgroundWithMemberId: (int) memberId completed:^(BOOL status){ //called after request has been completed.} - person Teffi; 05.03.2017