0

J'essaye de saisir la source d'une page en ligne pour l'analyser et mettre l'information dans le dictionnaire. Tout fonctionne bien, mais les données que je reçois ne sont pas complètes. La moitié des données arrivent seulement.Demande asynchrone ne donnant pas une réponse correcte

J'utilise ci-dessous le code:

-(void)getEmployeeTrips:(void(^)(NSDictionary *))completion 
    { 
    NSString *url; 
    url =[NSString stringWithFormat:@"%@://%@:%@/%@?dbname=%@&colname=%@",[[NSUserDefaults standardUserDefaults] stringForKey:@"mongoScheme"],[[NSUserDefaults standardUserDefaults] stringForKey:@"mongoHost"],[[NSUserDefaults standardUserDefaults] stringForKey:@"mongoPort"],@"query",[[NSUserDefaults standardUserDefaults] stringForKey:@"mongoDbName"],@"trips"]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init]; 

    [request setURL:[NSURL URLWithString:url]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:[NSJSONSerialization dataWithJSONObject:postDictionary options:kNilOptions error:&error]]; 
    [request setValue:finalAuthString forHTTPHeaderField:@"Authorization"]; 

    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ 
     NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); 
     completion([NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]); 
     }]; 
    } 

Quand je vous appelle ce bloc d'achèvement sur une autre des données de classe ne vient pas complète.

J'ai essayé avec NSUrlConnection méthodes de délégué et NSUrlSession également mais pas résolu mon problème.

Y at-il un problème avec mon code ou du serveur?

+0

Vous pouvez utiliser 'NSURLSessionDataTask' au lieu de 'NSURLConnection'. J'ai rencontré le même problème quand j'ai obtenu un fichier html du serveur. –

+0

@ sailendrak.J'ai essayé avec ça mais pas de changement – Himanth

+0

Pouvez-vous poster votre NSMutableURLRequest ??? –

Répondre

0

Si votre serveur web besoin d'une connexion persistante,

ou

si votre serveur a besoin de plus de temps que la valeur du délai d'attente maximum de NSURLRequest,

essayer d'utiliser CFReadStream

voici mon ancien code un flux en direct via la connexion http.

- (void) startLiveWithURL:(NSURL *)_url 
{ 
    url = _url; 

    NSLog(@"%@", url); 

    receivedData = [[NSMutableData alloc] init]; 

    request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, (CFStringRef)@"GET", (__bridge CFURLRef)url, kCFHTTPVersion1_1); 
    readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request); 
    CFReadStreamSetProperty(readStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue); 

    CFStreamClientContext ctxt = {0, (__bridge void *)(self), NULL, NULL, NULL}; 
    static const CFOptionFlags kNetworkEvents = kCFStreamEventHasBytesAvailable | kCFStreamEventEndEncountered | kCFStreamEventErrorOccurred; 

    if(CFReadStreamSetClient(readStream, kNetworkEvents, ReadStreamClientCallBack, &ctxt)) 
    { 
     CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); 
     if(CFReadStreamOpen(readStream)) 
     { 
      NSLog(@"opened"); 
     } 
    } 
} 

- (void) stopLive 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(startLiveWithURL:) object:url]; 

    if(readStream != nil) 
    { 
     CFReadStreamClose(readStream); 
     CFRelease(readStream); 
     CFRelease(request); 
     request = nil; 
     readStream = nil; 
    } 
} 

#pragma mark - cfnetwork 
static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventType type, void *clientCallBackInfo) 
{ 
    // [[LiveHttpParser sharedObject] handleNetworkEvent: type]; 
    switch (type) 
    { 
     case kCFStreamEventHasBytesAvailable: 
     { 
      UInt8 buffer[20480]; 
      CFIndex bytesRead = CFReadStreamRead(readStream, buffer, sizeof(buffer)); 
      if (bytesRead < 0) 
      { 
       [(__bridge LiveHttpParser *)clientCallBackInfo handleStreamError]; 
      } 
      else if (bytesRead) 
      { 
       [(__bridge LiveHttpParser *)clientCallBackInfo handleWithData:[NSData dataWithBytes:buffer length:bytesRead]]; 
      } 
     } 
      //   [self handleBytesAvailable]; 
      break; 
     case kCFStreamEventEndEncountered: 
      [(__bridge LiveHttpParser *)clientCallBackInfo handleStreamComplete]; 
      break; 
     case kCFStreamEventErrorOccurred: 
      [(__bridge LiveHttpParser *)clientCallBackInfo handleStreamError]; 
      break; 
     default: 
      break; 
    } 
}