2014-11-01 26 views
2

我正在研究使用YouTube Objective-C API檢索YouTube播放列表鏈接的類。iOS應用中youtube播放列表的網址

每個URL被存儲爲在稱爲arrayURL陣列的字符串strURL,(現在)arrayURL最終存儲在arrayFinal,我想從一個不同的類訪問。

在函數內我得到我想要的信息(NSLog(@"%@", self.arrayFinal);)。但是當從另一個類(例如ViewController)調用函數時,我總是會返回一個空數組。

ViewController.m

YTDataHandler *youtubeObj = [YTDataHandler new]; [youtubeObj initYoutubeArray]; NSLog(@"%@", [youtubeObj arrayFinal]);

YTDataHandler.h

#import <Foundation/Foundation.h> 
@interface YTDataHandler : NSObject 
{ 
NSMutableArray *arrayFinal; 
} 

- (void)initYoutubeArray; 
- (void)getYoutubeContent; 

@property (nonatomic, retain) NSMutableArray *arrayFinal; 

@end 

YTDataHandler.m

#import "YTDataHandler.h" 
#import "GTLServiceYouTube.h" 
#import "GTLYouTube.h" 
#import "GTLYouTubePlaylistSnippet.h" 
#import "GTLYouTubeResourceId.h" 

@implementation YTDataHandler 

@synthesize arrayFinal; 

- (void)initYoutubeArray { 
    self.arrayFinal = [[NSMutableArray alloc] init]; 

    [self getYoutubeContent]; 
} 

- (void)getYoutubeContent { 
    NSMutableArray *arrayURL = [[NSMutableArray alloc] init]; 

    // Create a service object for executing queries 
    GTLServiceYouTube *service = [[GTLServiceYouTube alloc] init]; 

    // API key 
    service.APIKey = @"YOUR_API_KEY"; 

    // Create a query 
    GTLQueryYouTube *query = [GTLQueryYouTube queryForPlaylistItemsListWithPart : @"id, snippet, contentDetails"]; 
    query.playlistId = @"UUa0XHGDbBL8re8UgO-OWNPA"; 
    query.maxResults = 20; 
    query.type = @"video"; 

    // Execute the query 
    GTLServiceTicket *ticket = [service executeQuery : query 
            completionHandler : ^(GTLServiceTicket *ticket, id object, NSError *error) { 

             // This callback block is run when the fetch completes 
             if (error == nil) { 

              GTLYouTubePlaylistItemListResponse *items = object; 

              // iteration of items and subscript access to items. 

              for (GTLYouTubePlaylistItem *item in items) { 

               // IDs of videos 
               NSString *strVideoId = [item.snippet.resourceId JSONValueForKey : @"videoId"]; 


               // encode and extend the videoId, result as an URL 
               NSString *strEncoded = [strVideoId stringByAddingPercentEscapesUsingEncoding : NSUTF8StringEncoding]; 
               NSString *strURL = [NSString stringWithFormat:@"http://www.youtube.com/watch?v=%@", strEncoded]; 

               // store strURL 
               [arrayURL addObject : (@"%@", strURL)]; 

              } 
              // finally store arrayURL 
              [self.arrayFinal addObject : (@"%@", arrayURL)]; 
              NSLog(@"%@", self.arrayFinal); 

             } else { 
              NSLog(@"Error: %@", error); 
             } 
            }]; 
} 


@end 

什麼我在// Execute the query -part做錯了什麼?

回答

0

在您的視圖控制器,當你撥打電話到getYoutubeContentYTDataHandler情況下,你不能指望立即填充陣列。當查詢執行並且執行處理程序代碼時,它將最終填充。在你的處理程序代碼中它總是有效的,因爲你在同一個線程中,並且在準備好的時候使用arrayFinal。在你的視圖控制器中,你需要等到數組準備好之後再開始使用它。例如。你可以在你的YTDataHandler上設置一個布爾標誌,你的視圖控制器可以註冊一個鍵值觀察回調函數(KVO),這樣當陣列就緒時你可以自動得到通知。

ps。 你爲什麼不使用:代替

[arrayURL addObject: strURL]; 

[arrayURL addObject : (@"%@", strURL)]; 

相關問題