2016-06-04 1 views
2

Je travaille sur une application iOS où j'utilise AVPlayer pour lire différentes vidéos mp4. La plupart du temps cela fonctionne bien. sauf parfois mon application gèle complètement le téléphone. Je n'ai pas été en mesure de l'attraper à quel endroit cela se produit, mais je pense que cela arrive généralement juste après cette ligne. J'ai vérifié en plaçant un tas de NSLog où imprimer la [[NSDate date] timeIntervalSince1970]:Si mon application iOS gèle l'ensemble du téléphone, est-ce considéré comme un bogue dans l'OS lui-même?

mylayer =[AVPlayerLayer playerLayerWithPlayer:myplayer]; 

Le gel se produit pendant quelques secondes (parfois beaucoup plus).

Même si j'appuie sur le bouton d'accueil ou sur le bouton de verrouillage, le téléphone ne répond pas. Je dois finir par appuyer sur le bouton de verrouillage pendant environ 6 à 10 secondes, ce qui redémarre tout le téléphone.

Notez que l'utilisation de la CPU et de la mémoire ne dépasse pas pendant ce temps.

Je comprends que mon code peut être bogué et tout, mais le système d'exploitation ne devrait pas être assez intelligent pour ne pas laisser une seule application geler complètement le téléphone entier? Serait-ce considéré comme un bug du système d'exploitation? Si oui, je pourrais enregistrer un DTS avec Apple.


**** EDIT: ajout du code ****

Notez le commentaire qui dit "// ceci est la ligne qui se fige"

dispatch_queue_t LOADQUEUE = dispatch_queue_create("com.yolo.LOADQUEUE", DISPATCH_QUEUE_CONCURRENT); 
     dispatch_async(LOADQUEUE, ^{ 
      AVURLAsset *avAsset = [[AVURLAsset alloc] initWithURL:url options:nil]; 


      NSLog(@"current time 4: %f",[[NSDate date] timeIntervalSince1970]); 
      if ([avAsset tracksWithMediaType:AVMediaTypeVideo] && [avAsset tracksWithMediaType:AVMediaTypeVideo].count>0) { 
       NSLog(@"current time 4.5: %f",[[NSDate date] timeIntervalSince1970]); 
       CGSize size = [[[avAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize]; 
       NSLog(@"current time 5: %f",[[NSDate date] timeIntervalSince1970]); 
       CGRect r = self.topHeader.frame; 
       r.size.height=((size.height*self.view.frame.size.width)/size.width)+self.topheaderBottomView.frame.size.height+self.topheadertopview.frame.size.height+self.itemTitle.frame.size.height; 
       howMuchToScrollToShowCommentButton=r.size.height; 

       dispatch_async(dispatch_get_main_queue(), ^{ 



        self.topHeader.frame=r; 
        [UIView animateWithDuration:0 animations:^{ 

         [self.mytableview setTableHeaderView:self.topHeader]; 

        }completion:^(BOOL finished) { 

         NSArray *keys = @[@"playable"]; 
         NSLog(@"current time 6: %f",[[NSDate date] timeIntervalSince1970]); 
         [avAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ 
          dispatch_async(dispatch_get_main_queue(), ^{ 
           NSLog(@"current time 7: %f",[[NSDate date] timeIntervalSince1970]); 
           AVPlayerItem *newItem = [[AVPlayerItem alloc] initWithAsset:avAsset]; 
           if (!myplayer) { 
            myplayer = [[AVPlayer alloc]initWithPlayerItem:newItem]; 
           } else { 
            [myplayer replaceCurrentItemWithPlayerItem:newItem]; 
           } 
           NSLog(@"current time 7.5: %f",[[NSDate date] timeIntervalSince1970]); 
           [myplayer addObserver:self forKeyPath:@"status" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil]; 
           [myplayer addObserver:self forKeyPath:@"rate" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil]; 
           [[NSNotificationCenter defaultCenter] addObserver:self 
                     selector:@selector(playerItemDidReachEnd:) 
                      name:AVPlayerItemDidPlayToEndTimeNotification 
                      object:[myplayer currentItem]]; 
           myplayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
           NSLog(@"current time 7.6: %f",[[NSDate date] timeIntervalSince1970]); 
           mylayer =[AVPlayerLayer playerLayerWithPlayer:myplayer]; // this is the line which freezes 
           NSLog(@"current time 7.7: %f",[[NSDate date] timeIntervalSince1970]); 


           [playerView.layer addSublayer:mylayer]; 
           mylayer.videoGravity = AVLayerVideoGravityResize; 
           [mylayer setFrame:playerView.bounds]; 
           [myplayer seekToTime:kCMTimeZero]; 
           NSLog(@"current time 8: %f",[[NSDate date] timeIntervalSince1970]); 
          }); 
         }]; 


        }]; 
       }); 
      } else { 
       NSLog(@"ITEM doesn't exist"); 
      } 
     }); 

sortie: Notez la pause de 21 secondes entre les heures 7,6 et 7,7:

2016-06-04 01:27:20.853 XYZ[402:49072] current time 7: 1465018040.853897 
2016-06-04 01:27:20.875 XYZ[402:49072] current time 7.5: 1465018040.875220 
2016-06-04 01:27:20.875 XYZ[402:49072] current time 7.6: 1465018040.875871 
2016-06-04 01:27:41.841 XYZ[402:49072] current time 7.7: 1465018061.841419 
2016-06-04 01:27:41.841 XYZ[402:49072] current time 8: 1465018061.841863 

Édition 2:

J'ai mis l'application en pause dans xcode et j'ai regardé ce que les threads faisaient sur la gauche. Voici une capture d'écran:

enter image description here

Répondre

1

Cela pourrait être un symptôme de débogage et en cours d'exécution à travers XCode. Vous avez raison, normalement, vous devriez toujours pouvoir cliquer sur le bouton Accueil et quitter l'application.

Modifiez votre schéma et passez de Debug à Release. Exécutez une génération une fois via Xcode. Tuez l'application, puis lancez-la sans Xcode depuis l'écran d'accueil de l'appareil.

+0

J'ai remarqué que mon application gèle l'OS même quand elle n'est pas en mode debug et qu'elle n'est pas connectée à mon mac. cela semble particulièrement se produire quand mon internet est lent (quand je suis en train et que mon réseau est merdique) –

+0

Si vous pouviez mettre à jour votre question et inclure plus de code lié à l'action qui cause le problème, nous pourrions vous aider. On dirait que quelque chose sur le fil principal verrouille tout. – KevinS

+0

merci pour votre aide, je viens d'ajouter mon code et la sortie NSLog. –