我正在开发一个类,该类通过使用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)];