iOS应用程序中youtube播放列表中的URL



我正在开发一个类,该类通过使用youtube Objective-C API检索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部分做错了什么?

在视图控制器中,当您在YTDataHandler实例上调用getYoutubeContent时,不能期望立即填充数组。它最终将在执行查询和处理程序代码时填充。在您的处理程序代码中,它总是有效的,因为您在同一个线程中,并且在它准备好时使用arrayFinal。在您的视图控制器中,您需要等到数组准备好后才能开始使用它。例如,您可以在YTDataHandler上设置一个布尔标志,视图控制器可以在该标志上注册一个键值观察回调(KVO),这样您就可以在数组准备好时自动收到通知。

ps。为什么不使用:

[arrayURL addObject: strURL];

而不是:

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

相关内容

  • 没有找到相关文章

最新更新