目标c完成处理程序

时间:2017-03-04 12:32:02

标签: objective-c completionhandler

我有一个带有getContentInBackgroundWithMemberId和postRequest函数的RequestManager类。我想从我的视图控制器中调用它们并使用完成处理程序获取结果。如何编辑我的功能?

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

1 个答案:

答案 0 :(得分: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);
        }

    }];
}

已经有大量的Q&amp; A用于街区。这可能有助于进一步解释 How to write an Objective-C Completion Block