찾다

 >  Q&A  >  본문

objective-c - GCDAsyncsocket 放到子线程总会不不执行,这是怎么回事

GCDAsyncsocket 使用异步串行子线程中for循环执行一半就不执行了,代码如下,过程是点击发送按钮返回到主页面,然后异步执行下面的代码上传图片;

    
    - (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梦2754일 전599

모든 응답(2)나는 대답할 것이다

  • 漂亮男人

    漂亮男人2017-05-02 09:36:17

    정보가 완전하지 않아 이유를 판단하기 어렵지만 이 경우에는 for 루프를 내부에 배치해야 합니다
    또한 리소스에 액세스할 때 잠금을 추가해야 합니다

    으아아아

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-05-02 09:36:17

    코드와 로그가 불완전하고 이유를 알 수 없습니다. 두 가지 이유를 추측해 보세요:

    1. 실제로는 여전히 작동하지만 디버깅 문제로 인해 상태를 파악할 수 없습니다

    2. 정말 중단되었습니다. 구체적인 이유는 심층 조사가 필요하지만, 그렇다면 대기열을 로컬 변수로 사용하는 대신 오랫동안 보관하는 것이 좋습니다. 지역 변수, 직렬 대기열을 만드는 이유는 무엇입니까?

    회신하다
    0
  • 취소회신하다