objective-c - GCDAsyncsocket 放到子執行緒總是會不執行,這是怎麼回事
过去多啦不再A梦
过去多啦不再A梦 2017-05-02 09:34:17
0
2
542

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梦

全部回覆(2)
漂亮男人

資訊不大全,不好判斷,原因,不過像這種情況,應該把for循環放到裡面
還有,資源訪問的時候都應該加個鎖

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

程式碼和日誌不完整,看不出什麼原因。猜測原因兩:

  1. 其實還咋執行,但是調試的問題你抓不到狀態了

  2. 真的被中斷了,具體原因要深究,不過建議你把queue做一個引用,長期持有,不作為局部變量,如果局部變量那麼做一個串行隊列的意義在哪裡?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!