2011-06-18 34 views
3

我假定initWithContentURL:方法不是異步的。我添加了以下方法在後臺執行加載,然後將臨時播放器分配給我的變量。異步MPMoviePlayerController負載沒有持續時間值

-(void)createPlayer { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

MPMoviePlayerController *temp = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"URLString"]]; 

[self performSelectorOnMainThread:@selector(passPlayer:) withObject:temp waitUntilDone:YES]; 

[temp release]; 
[pool release]; 
} 

-(void)passPlayer:(MPMoviePlayerController*)temp {  
player = [temp retain]; 
player.movieSourceType = MPMovieSourceTypeStreaming; 
//player.view.hidden = YES; 
//[self.view addSubview:player.view]; 
[player prepareToPlay]; 
} 

問題是,當我打印出來的球員的時間,我得到這樣的:

double duration = player.duration; 
NSLog(@"duration: %f, duration); 

console output: duration: nan 

我已經加入了MPMoviePlayerControllerNotifications當有可用的持續時間值被通知,但即使是這樣的價值仍然是'南'。如果我在主線程上執行加載,則持續時間有一個值,但我不想使用主線程,所以我的UI不會鎖定。

任何想法?

+0

您的初始假設是錯誤的 - initWithContentURL是異步的。 – Till

+0

@Till任何文檔指向我? – jmosesman

+0

不,不幸的是,我所得到的是大量使用它的經驗。即使遠程服務器不可訪問,它也不會引入可識別的延遲。 – Till

回答

2

從官方文檔:

討論 如果電影的時間是不知道,在此屬性的值是0.0。如果隨後確定持續時間,則更新此屬性併發布MPMovieDurationAvailableNotification通知。

因此,使用NSNotificationCenter來註冊MPMovieDurationAvailableNotification通知。

+0

我添加了通知,偶爾(和隨機)我仍然會得到'南'值。任何想法? – jmosesman

+0

但你檢查通知中調用的方法的持續時間,對吧? – Johnmph

+0

對我NSLog'd它在通知調用的選擇器方法。 – jmosesman

3

發生這種情況是因爲電影播放器​​無法計算持續時間。如果您訂閱MPMovieDurationAvailableNotification通知,則會在您確定價值時通知您。

MPMovieDurationAvailableNotification

當電影對象的 持續時間是 確定該通知發佈。 通知的對象是MPMoviePlayerController對象自身的 。 沒有userInfo字典。 持續時間值反映在電影播放器​​ 控制器的持續時間屬性 中。

來源:Apple documentation

+0

我添加了通知,偶爾(隨機)我仍然會得到一個'南'值。任何想法? – jmosesman

4

首先,不要在非主線程上創建UI對象。所有UI操作必須在主線程上完成,否則會發生奇怪的事情。例如,也許,永遠不會加載電影,並在此期間返回NAN。

其次,initWithContentURL:可能異步或不會有通知讓你知道電影實際加載時。只需像通常那樣創建控制器,訂閱相應的通知以瞭解狀態何時更新,然後立即檢查狀態,以防電影碰巧是本地文件或已經緩​​存,因此負載能夠同步發生。

+0

+1重要問題的好答案。 – Till

+0

似乎'init'方法是同步的。它捆綁了用戶界面,並且滯後了新的視圖推送 - 這正是我想要避免的。 每當我用'initWithContentURL:'方法創建播放器,或者使用'alloc'和'init'並且執行'setContentURL:'時,它將UI綁定起來。我可以在稍後創建播放器(就像他們按下播放按鈕時一樣),但我希望能夠儘早開始加載。 – jmosesman