2016-10-27 6 views
0

NSURLConnectionDelegateメソッドを実装するサービスAPIクラスのようなものがあります。私は、このメソッドのいくつかが廃止され、AppleがNSURLSessionの使用を提案していることに気付きました。私はこのサービスAPIの独自のデリゲートを作成しました。これは、呼び出し側クラスが実装し、応答を受け取ったときに実行されます。 NSURLSessionを使用しているときに、私が何か類似のことをする方法を探しています。NSURLConnectionをNSURLSessionに変換する際にコントローラに応答を渡す

NSURLConnectionと私の存在のもの:

- (void)httpServiceRequest:(NSMutableURLRequest *)serviceRequest { 
    //[[NSURLSession sharedSession] dataTaskWithRequest:serviceRequest] resume]; 
    self.requestConnection = [NSURLConnection connectionWithRequest:serviceRequest delegate:self]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    [self.delegate getResponseData:self.responseData sender:self]; 
} 

クラスの要求を行って応答を取得: ServiceAPI実装ファイルで

@class ServiceAPI; 
@protocol ServiceAPIDelegate <NSObject> 

- (void)getResponseData:(NSData *)responseData; 

@end 

@interface ServiceAPI : NSObject<NSURLCoDelegate> 
- (void)httpServiceRequest:(NSMutableURLRequest *)serviceRequest; 
@property (nonatomic, weak) id <ServiceAPIDelegate> delegate; 
@end 

@interface CallingController : UITableViewController<ServiceAPIDelegate> 
@end 

実装ファイルCallingController:

- (void)getResponseData:(NSData *)responseData { 
    // Do something with response. 
} 

私はNSURLSessionを使用している間、呼び出し元のクラスはちょうどNSURLConnectionのような応答方法を処理させるにはどうすればよいです。 NSURLSessionを読んだことは、このような完了ハンドラのものを使用して一緒に処理され、要求と応答のように見えますが:

NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=apple&media=software"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
    NSLog(@"%@", json); 
}]; 
私はまだちょうど呼び出しを行うためのAPIにサービスを提供するための要求を下に渡すサービスAPIのクラスと私のコントローラを持ちたい

応答が戻ったら、コントローラに渡されます。どのように私はNSURLSessionを使用している間、コントローラに応答を渡すのですか?

答えて

0

何か:インプリメンテーションで

@class ServiceAPI; 

    @protocol ServiceAPIDelegate <NSObject> 

    - (void)getResponseData:(NSData *)responseData; 

    @end 

    @interface ServiceAPI : NSObject<NSURLSessionDelegate> 
    - (void)httpServiceRequest:(NSMutableURLRequest *)serviceRequest; 
    @property (nonatomic, weak) id <ServiceAPIDelegate> delegate; 
    @end 

- (void)httpServiceRequest:(NSMutableURLRequest *)serviceRequest { 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *downloadTask = 

    [session dataTaskWithRequest:serviceRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

     [self.delegate getResponseData:data sender:self]; 

    }]; 

    [downloadTask resume]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // no use 
} 
0

完了ブロックなしでNSURLSessionDataTaskを初期化することによって、あなたが望むものを達成することはできます。そうすれば、デリゲートメソッドを代わりに呼び出すことになります。例えば

NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=apple&media=software"]]; 
[dataTask resume]; 

は、要求が完了したときに知ってNSURLSessionTaskDelegateを実装してもNSURLSessionDataDelegate

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask 
           didReceiveResponse:(NSURLResponse *)response 
            completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler; 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask 
            didReceiveData:(NSData *)data; 

を実装します。このような

/* Sent as the last message related to a specific task. Error may be 
* nil, which implies that no error occurred and this task is complete. 
*/ 
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task 
          didCompleteWithError:(nullable NSError *)error; 
関連する問題