0

startLoading()元のリクエストを送信する前に、内部で別の http 呼び出しを作成しようとしています。コードは以下のようなものです:

+canInitWithRequest(){
   if(self.request.valueForKey("handledKey") != nil){
      return false;
   }
   return true;
}

-startLoading(){

   __block NSString * realURLString = self.request.URL.absoluteString;

   //send separate http call for validation

   NSMutableURLRequest validationRequest = [NSMutableURLRequest initWithURL:[URL initWithString:OUR_VALIDATION_SERVER_URL]];

   {code to fill info into validationRequest, etc.}   

   semaphore = dispatch_semaphore_create(0); // need to sync to make sure we use the expected/real url
   [NSURLProtocol setValue:YES forkey:"handledKey" inRequest: validationRequest];
   [NSURLSession sendAsyncRequest:validationRequest ...completionHandler(response, data, error){
            realURLString = xxxx;
            print(current thread info);// line 1
       dispatch_semaphore_signal(sema);
   }];
   print(current thread info);// line 2
   dispatch_semaphore_wait(sema);

  //continue original request with real url
  NSMutableURLRequest realRequest = NSMutableURLRequest(realURLString);
  [NSURLProtocol setValue:YES forkey:"handledKey" inRequest: realRequest];
  self.connection = [NSURLSession withRequst:realRequest delegate:self];
}

}

通常のコンテンツの webView で使用される場合、非常に同じコードが機能します(htm, css, etc。) [ケース 1] またはm3u8/mpg[ケース 2] (プレーヤーは webView に自動的に埋め込まれます);

ただし、同じ [ケース 3] を再生するために AVPlayer を直接使用するとm3u8、メソッドの後で検証呼び出しが約 1 分間スタックします (エラーを調べる場合は要求タイムアウト) canInitWithRequest()。その後、次のリクエストは失敗します。

最初はスレッドの問題だと思いました。しかし、1 行目と 2 行目では異なるスレッドが表示されました。

AVPlayer は、http 要求を処理するために webView とは異なるメカニズムを使用したと思われます。[ケース 2] では、おそらく webView が AVPlayer をオーバーライドしただけです。しかし、よくわかりません。

誰かがより多くの洞察を与えることができますか?

ありがとう!

4

1 に答える 1

0

おそらく、メインスレッドをブロックしています。startLoading() メソッドはすぐに戻る必要があります。何らかの理由でブロックすることはありません。認証リクエストを開始してから戻ります。セマフォの待機後にすべてのコードを取得し、完了ハンドラーに移動します。

于 2016-05-08T03:02:21.370 に答える