Deezer iOS SDK-DZRTrack-获取;备选方案;当可读性为false时跟踪
我正在使用新的Deezer iOS SDK(0.9.0),当返回的曲目的Deezer iOS SDK-DZRTrack-获取;备选方案;当可读性为false时跟踪,ios,objective-c,deezer,Ios,Objective C,Deezer,我正在使用新的Deezer iOS SDK(0.9.0),当返回的曲目的readable属性设置为NO时,我需要找到替代曲目(如果有) 这是我正在测试的轨迹: 在英国(我所在的地方)没有这条赛道,但有另一条赛道可供选择 以下是我在API Explorer中查询轨迹时的API响应(来自英国): 如您所见,readable为false但可选。readable为true。在这种情况下,我想使用备选曲目的id,因为原始曲目在我的国家/地区不可用 基于此响应,我可以简单地拉出替代标识符并使用它,但是因为我
readable
属性设置为NO
时,我需要找到替代曲目(如果有)
这是我正在测试的轨迹:
在英国(我所在的地方)没有这条赛道,但有另一条赛道可供选择
以下是我在API Explorer中查询轨迹时的API响应(来自英国):
如您所见,readable
为false
但可选。readable
为true
。在这种情况下,我想使用备选
曲目的id,因为原始曲目在我的国家/地区不可用
基于此响应,我可以简单地拉出替代标识符并使用它,但是因为我使用的是新的Deezer iOS SDK,所以我似乎无法做到这一点
在文档之后,我使用以下代码从API中获取所需的所有值:
// the manager to use in the requests
DZRRequestManager *manager = [DZRRequestManager defaultManager];
// the keys we wish to obtain
NSArray *keys = @[ @"id", @"readable", @"alternative.id", @"alternative.readable" ];
// the track id
NSString *identifier = @"95029960";
// fetch the track
[DZRTrack objectWithIdentifier:identifier requestManager:manager callback:^(DZRTrack *track, NSError *error) {
// fetch the keys
[track valuesForKeyPaths:keys withRequestManager:manager callback:^(NSDictionary *values, NSError *keyPathsError) {
// log what we got.
NSLog(@"Got Values: %@", values);
}];
}];
现在,我希望得到所有4个值,只要它们出现在JSON api响应中(它们是),但我得到以下输出:
2015-04-02 09:48:35.485 <redacted>[694:115244] Got Values: {
id = 95029960;
readable = 0;
}
这显然表明我试图获取一个不受支持的密钥,但为什么不受支持呢?这不是一个受支持的密钥,因为SDK的播放器还没有考虑到其他选择,我想很快就会做到。你可以通过一个小方法来绕过这个限制 因此,您需要在DZRTrack上创建一个类别,然后swizzle
-[DZRObject supportedInfoKeys]
在数组的末尾添加键替代项
。仅此一项就可以在DZRTrack
的实例上为您提供一个“属性”alternative
,它将是一个包含JSON内容的NSDictionary
不过,您可以再往前走一点,找到完整的DZRTrack
对象作为替代方案。SDK在解析来自API的响应时,在某个点上似乎在实例上查找parseFoo:error:
方法。因此,通过将方法parseAlternative:error:
method放入您的类别中,您可以解析JSON并获取DZRTrack对象。为此,您需要使用SDK的私有API:+[DZROject objectFromJSON:error::
其中包括类别的实现
@interface DZRObject (AlternativeTrack)
+ (id)objectFromJSON:(id)JSON error:(NSError **)error;
@end
@implementation DZRTrack (AlternativeTrack)
+ (void)load
{
static dispatch_once_t once;
dispatch_once(&once, ^{
Class aClass = [self class];
SEL original = @selector(supportedInfoKeys);
SEL swizzled = @selector(alternativeTrack_supportedInfoKeys);
Method originalMethod = class_getInstanceMethod(aClass, original);
Method swizzledMethod = class_getInstanceMethod(aClass, swizzled);
BOOL didAddMethod = class_addMethod(aClass, original,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(aClass, swizzled,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
}
else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}
- (NSArray *)alternativeTrack_supportedInfoKeys
{
return [[self alternativeTrack_supportedInfoKeys] arrayByAddingObject:@"alternative"];
}
- (id)parseAlternative:(id)JSON error:(NSError **)error
{
return [DZRObject objectFromJSON:JSON error:error];
}
@end
您能检查一下
密钥路径错误中的内容吗?@rckoenes请查看我的更新。谢谢。谢谢。但是我认为这个修复程序不正确。。如果在API中存在“可选”轨迹时调用-[DZRTrack ValuesforkeyPath:withRequestManager:callback://code>,则会调用完成块。但是,如果API响应中不存在“可选”轨迹,则在解析时不会调用完成块。看起来我需要在请求备用钥匙之前先检查一下跑道上是否有备用场地。我们可以用一个合适的补丁来更新SDK吗?没错,如果键路径中的中间值为nil
,则有一个bug阻止调用回调。这将在SDK的下一版本中修复。或者,如果您被阻止,您可以使用[DZRObject valueForKey:error:callback:://code>方法请求曲目的备选
。此调用将导致SDK调用您的回调,然后查询可选轨迹上的值。
Domain: DZRModelErrorDomain,
Code: 4,
UserInfo: {
"NSLocalizedDescriptionKey" : "Some object could not be parsed",
"DZROriginalErrorsKey" : [
{
Domain: DZRModelErrorDomain,
Code: 4,
UserInfo: {
"NSLocalizedDescriptionKey" : "You requested and unknown key from Deezer Object",
"DZRRequestedPropertyKey" : "alternative"
}
}
]
}
@interface DZRObject (AlternativeTrack)
+ (id)objectFromJSON:(id)JSON error:(NSError **)error;
@end
@implementation DZRTrack (AlternativeTrack)
+ (void)load
{
static dispatch_once_t once;
dispatch_once(&once, ^{
Class aClass = [self class];
SEL original = @selector(supportedInfoKeys);
SEL swizzled = @selector(alternativeTrack_supportedInfoKeys);
Method originalMethod = class_getInstanceMethod(aClass, original);
Method swizzledMethod = class_getInstanceMethod(aClass, swizzled);
BOOL didAddMethod = class_addMethod(aClass, original,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(aClass, swizzled,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
}
else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}
- (NSArray *)alternativeTrack_supportedInfoKeys
{
return [[self alternativeTrack_supportedInfoKeys] arrayByAddingObject:@"alternative"];
}
- (id)parseAlternative:(id)JSON error:(NSError **)error
{
return [DZRObject objectFromJSON:JSON error:error];
}
@end