2017-03-04 11 views
-2

私は、getContentInBackgroundWithMemberIdとpostRequest関数を持つRequestManagerクラスを持っています。私はそれらを私のView Controllerから呼び出して、完了ハンドラを使って結果を得たいと思う。私の機能を編集するには?目的c完了ハンドラ

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

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 & Aさんのトンがすでにあります。さらに説明するのに役立つものは次のとおりです。 How to write an Objective-C Completion Block

+0

thanxです。ビューコントローラから呼び出すときの構文は何ですか? –

+0

@DenisWindover 'getContentInBackgroundWithMemberId:(int)memberIdが完了しました:^(BOOL状態){//要求が完了した後に呼び出されます} – Teffi

関連する問題