ホームページ  >  に質問  >  本文

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梦2705日前539

全員に返信(2)返信します

  • 漂亮男人

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

    情報が不完全で原因の判断が難しいですが、この場合はforループを中に入れる必要があります
    また、リソースにアクセスする際にはロックを追加する必要があります

    リーリー

    返事
    0
  • 大家讲道理

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

    コードとログが不完全で、その理由がわかりません。 2 つの理由を推測してください:

    1. 実際にはまだ実行できますが、デバッグの問題によりステータスを取得できません

    2. 具体的な理由を詳しく調査する必要がありますが、ローカル変数としてではなく、キューを参照にして長時間保持することをお勧めします。それはローカル変数ですが、シリアルキューを作成する意味は何ですか?

    返事
    0
  • キャンセル返事