objective-c - GCDAsyncsocket ne parvient toujours pas à s'exécuter lorsqu'il est placé dans un thread enfant. Que se passe-t-il ?
过去多啦不再A梦
过去多啦不再A梦 2017-05-02 09:34:17
0
2
666

GCDAsyncsocket utilise le sous-thread série asynchrone pour arrêter l'exécution de la boucle for à mi-parcours. Le code est le suivant. Le processus consiste à cliquer sur le bouton d'envoi pour revenir à la page principale, puis à exécuter le code suivant de manière asynchrone pour le télécharger. l'image

    
    - (void)sendAction{
      dispatch_queue_t queue = dispatch_queue_create("uploadImage", DISPATCH_QUEUE_SERIAL);
         dispatch_async(queue, ^{
       for (int i =0; i < 10; i++) {
              
         NSLog(@"async ------------ %@", [NSThread currentThread]);
        
        //第一张图的资源
        PHAsset *asset = self.sendImageArray[i];
        NSString *fileType;
        NSString *fileName;
      
        if (asset.mediaType == PHAssetMediaTypeImage) {
            fileType = @"jpg";
            NSData *data = [NSData dataWithContentsOfFile:filePath[i]];

            [self upLoadImageData:data type:@"jpg" name:fileName];
        } else if(asset.mediaType == PHAssetMediaTypeVideo) {
            fileType = @"mp4";
              NSData *data = [NSData dataWithContentsOfFile:filePath[i]];
            [self uploadMp4Data:data type:fileType name:fileName];
            
        }       
  }
  });
  }
  
  - (void)upLoadImageData:(NSData*)data  type:(NSString *)fileType name:(NSString *)fileName{
     dataNameMutStr = [NSMutableString stringWithFormat:@"ios_%@_%@.jpg\n", @"图片",fileName];
   NSData *dataName = [dataNameMutStr dataUsingEncoding:NSUTF8StringEncoding];
   [self sendSocket:dataName data:data];
   }
   
   
   - (void)sendSocket:(NSData *)dataName data:(NSData *)datas{
     [self createClientTcpSocket];//发图片
     [_asyncsocket writeData:datas withTimeout:-1 tag:0];

   }
过去多啦不再A梦
过去多啦不再A梦

répondre à tous(2)
漂亮男人

Les informations ne sont pas complètes et il est difficile de juger de la raison, mais dans ce cas, la boucle for doit être placée à l'intérieur
De plus, un verrou doit être ajouté lors de l'accès aux ressources

dispatch_async(queue, ^{
    for (int i =0; i < 10; i++) {
        // upload ....
    }
})
大家讲道理

Le code et les journaux sont incomplets et je ne vois pas pourquoi. Devinez deux raisons :

  1. En fait, cela fonctionne toujours, mais vous ne pouvez pas connaître le statut en raison de problèmes de débogage

  2. Il a été vraiment interrompu. La raison spécifique doit être étudiée en détail. Cependant, il est recommandé d'utiliser la file d'attente comme référence et de la conserver pendant une longue période plutôt que comme variable locale. une variable locale, quel est l'intérêt de faire une file d'attente série ?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal