我有一个带有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
答案 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