2017-01-23 15 views
0

私のアプリケーションは約10から30のWebサービス(get/post)を持っています。以前はAsync NSURLconnectionを使用していました。すべてのサービスを実行するのに約5秒かかります。しかし、今はNSurlsessionをnsurlconnectionに比べて応答が遅れてしまいました。これは4〜6倍遅れています。ここで私は参考のためにwebserviceメソッドコードの1つを添付しています。以下のように私はすべてのメソッドのコードを持っています。NSURLSession実装パフォーマンスの問題

例NSURLsessionコード

#pragma mark - NSURLSession 

- (NSURLSession *)createSession 
{ 
    NSLog(@"DSCReturnAPI: %s",__func__); 

    static NSURLSession *session = nil; 

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; 

    sessionConfig.timeoutIntervalForRequest = WEBSERVICE_TIMEOUT; 

    session = [NSURLSession sessionWithConfiguration:sessionConfig 
              delegate:self 
             delegateQueue:[NSOperationQueue mainQueue]]; 


    return session; 
} 


#pragma mark - API Callbacks 
-(void)getMyData{ 
    @try { 
     _webServieRequestType = HWDSCReturnGetRequestType; 

     NSString *countrycode    = [BusinessManager sharedInstance].countryCode;//[HWUserDefaults countryCode]; 
     NSString *userid     = [BusinessManager sharedInstance].userId;// [HWUserDefaults userId]; 
     NSString *accessToken    = [BusinessManager sharedInstance].accessToken;//[HWUserDefaults accessToken]; 
     NSString *deviceId     = [HWUserDefaults deviceId]; 
     [HelperCallbacks logText:[NSString stringWithFormat:@"AccessToken %@",accessToken]]; 

     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
     [request setURL:[NSURL URLWithString:API_DSCRETURN(countrycode,userid)]]; 
     [request setHTTPMethod:@"GET"]; 
     [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
     [request setValue:accessToken forHTTPHeaderField:@"Authorization"]; 
     [request setValue:deviceId forHTTPHeaderField:@"deviceId"]; 
     [request setValue:@"ba598025146eff37e26c9150b180a78b" forHTTPHeaderField:@"If-None-Match"]; 

     theSession = [self createSession]; 
     theDataTask = [theSession dataTaskWithRequest:request]; 

     [theDataTask resume]; 


    } 
    @catch (NSException *exception) { 
     [ExceptionHandler sendException:exception]; 
    } 
} 


#pragma mark - NSURLSessionDataDelegate 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask 
    didReceiveData:(NSData *)data { 
    NSLog(@"DSCReturnAPI: %s",__func__); 

    // NSArray *dataArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 


    if (theSession == session) { 
     if (_receivedData == nil) { 
      _receivedData = [[NSMutableData alloc] initWithData:data]; 
     } else { 
      [_receivedData appendData:data]; 

     } 
    } 
    else 
    { 
     //NSLog(@""); 
    } 
    } 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { 
    NSLog(@"DSCReturnAPI: %s",__func__); 


    if (theSession == session) { 
     [BusinessManager sharedInstance].urlResponseRecieved = NO; 
     NSLog(@"DSCReturnAPI: httpResponse:%@",response); 
     NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; 
     httpStatusCode =(int) [httpResponse statusCode]; // To track response Code: 
     NSLog(@"DSCReturnAPI : Http code:%d",httpStatusCode); 
     NSLog(@"DSCReturnAPI : Headers %@",[httpResponse allHeaderFields]); 
     _receivedData = [[NSMutableData alloc]init]; } 
     completionHandler(NSURLSessionResponseAllow); 
    } 
#pragma mark - NSURLSessionTaskDelegate 

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ 
    NSLog(@"DSCReturnAPI: %s",__func__); 



    NSLog(@"DSCReturnAPI: didFailWithError :error : %@ errorCode: %ld",error.description,(long)error.code); 
    @try { 

     if ([self.serviceDelegate conformsToProtocol:@protocol(ServiceMgrProtocol)] && [self.serviceDelegate respondsToSelector:@selector(webServiceDidFailDSCReturnWithError:)]&& error.code != 0) { 
      [self.serviceDelegate webServiceDidFailDSCReturnWithError:error.localizedDescription]; 
     } 
     else { 
      NSLog(@"DSCReturnAPI:SUCCESS"); 
      [self processResponse]; 

     } 

     } 
    @catch (NSException *exception) { 
     [ExceptionHandler sendException:exception]; 
    } 
    @finally { 
     if (theSession) { 
      theSession = nil; 
     } 
     _receivedData = nil; 
    } } 

答えて

0

私はNSURLSessionのような方法のために行く必要性を全く考えていません。メインスレッド上で動作する独自のブロックを持っています。

NSMutableURLRequest *request =[[NSMutableURLRequest alloc] initWithURL:requestURL]; 

     NSLog(@"fetchAPromotionWithType = %@", requestURL); 
     [request setHTTPMethod:@"GET"]; 

     NSURLSession *session = [NSURLSession sharedSession]; 
     NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
               completionHandler: 
             ^(NSData *data, NSURLResponse *response, NSError *error) 
             { 

              dispatch_async(dispatch_get_main_queue(), ^{ 


               NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; 
               int responseStatusCode = (int)[httpResponse statusCode]; 

               if (responseStatusCode == OK_RESPONSE_CODE || responseStatusCode == CREATED_RESPONSE_CODE || responseStatusCode == ACCEPTED_RESPONSE_CODE || responseStatusCode == PARTIAL_RESPONSE_CODE) 
               { 
                if (data) 
                { 
                 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 
                 NSLog(@"Data->%@",dict); 

                 if (dict != nil && [dict isKindOfClass:[NSDictionary class]]) 
                 { 
                  NSDictionary *dataDict = [dict objectForKey:@"data"]; 

                  if (dataDict != nil && [dataDict isKindOfClass:[NSDictionary class]]) 
                  { 
                   //Get your success Data 
                  } 
                 } 
                } 
               } 
               else 
               { 
                if (responseStatusCode == 0) 
                { 
                 NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"No Connection! Please try again.", @"message", nil]; 
                 //Get Your Fail Data 
                } 
                else if (data) 
                { 
                 // NSArray *tempArray = @[@"fan", @"vungle"]; 
                 //[JLSharedData sharedManager].savedWaterfallInterstitialArray = nil; //testing 

                 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 
                 //Get Your Fail Data 
                } 
               } 

              }); 

             }]; 

     [task resume]; 
    }]; 
+0

こんにちは、私はまた、いくつかの明確なキャッシュやサーバのメモリが増加しようとすると、サーバ側から必要なクリーンアップをしなければならないこと、応答 –

+0

の遅れていることを試してみました。 NSURLSessionは、AFNetWorkingよりも非常に高速で信頼性の高い応答を提供するmorden Cocoa Touchの1つだけです。 –

+0

私はサーバーpplで確認しましたが、キャッシュについては確信があり、キャッシュはありません。単純に再起動されますが、変更はありません –