【问题标题】:How to properly check if a UIImage is nil using the YouTube Api v3 in Swift?如何在 Swift 中使用 YouTube Api v3 正确检查 UIImage 是否为零?
【发布时间】:2016-07-04 19:24:55
【问题描述】:

我在检查 UIImage 是否为 nil 以显示 UIAlertViewController 时遇到问题。

我的应用从 youtube 频道获取播放列表。其中一个播放列表包含已被 YouTube 删除的视频,因此在获取播放列表数据时不包含“缩略图”键。

这是我实现的代码,用于检查是否有要显示的缩略图,否则显示警报。

print("playlistVideos_ARRAY = \(self.playlistVideos_ARRAY)")

print("startOfNextIndexForVideos = \(self.startOfNextIndexForVideos)")

if let thumbnailImage: UIImage = UIImage(data: NSData(contentsOfURL: NSURL(string: ( ( ( (self.playlistVideos_ARRAY[self.startOfNextIndexForVideos] as! Dictionary<NSObject, AnyObject> )["snippet"] as! Dictionary<NSObject, AnyObject> )["thumbnails"] as! Dictionary<NSObject, AnyObject> )["high"] as! Dictionary<NSObject, AnyObject> )["url"] as! String )! )! )!
{
     print("111111111")
     self.thumbnailOfVideo.append(thumbnailImage)
}
else
{
     print("222222222")

     let message = UIAlertController(title: "Uh Oh!", message: "There is an issue with this playlist :(", preferredStyle: .Alert)

     let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
                        message.addAction(defaultAction)

     dispatch_async(dispatch_get_main_queue(), {
                            self.presentViewController(message, animated: true, completion: nil)
                        })
}

但是,它从不输出222222222。它总是在 if 检查时失败,输出如下:

playlistVideos_ARRAY = [{
    etag = "\"q5k97EMVGxODeKcDgp8gnMu79wM/Jl892aZsvFYpvjE5ENwTItH9cqQ\"";
    id = PLP2q8Ric9B9X6r8L2LA7xRwg0HNnKL3RLaooSkbmjTxo;
    kind = "youtube#playlistItem";
    snippet =     {
        channelId = UC5ltMmeC4YFaart1SSXdmAg;
        channelTitle = "Viet My Television";
        description = "This video is private.";
        playlistId = "PLxnnlv22Xcq34TNdsMxEIKvIHE_phd7XK";
        position = 0;
        publishedAt = "2016-03-16T18:51:39.000Z";
        resourceId =         {
            kind = "youtube#video";
            videoId = uPnWMZ1pbSc;
        };
        title = "Private video";
    };
}]
startOfNextIndexForVideos = 0
fatal error: unexpectedly found nil while unwrapping an Optional value

在检查这个方面我做错了什么?谢谢。

编辑: 下面是我的playlistVideos_ARRAY 通过 GET 请求获取的输出,该请求包含一个有效的播放列表以及 YouTube 尚未删除的相关视频的缩略图:

playlistVideos_ARRAY = [{
    etag = "\"q5k97EMVGxODeKcDgp8gnMu79wM/U4OVbnjwS2bbU44Q1Hijy6-koAE\"";
    id = "PLP2q8Ric9B9VZXfc41HzRjprfOHpOYQd_SbLAuuxZVyw";
    kind = "youtube#playlistItem";
    snippet =     {
        channelId = UC5ltMmeC4YFaart1SSXdmAg;
        channelTitle = "Viet My Television";
        description = "";
        playlistId = PLxnnlv22Xcq0HpE242iwHh8IP78esU9sF;
        position = 0;
        publishedAt = "2016-02-15T23:25:20.000Z";
        resourceId =         {
            kind = "youtube#video";
            videoId = mIW5trLZJcM;
        };
        thumbnails =         {
            default =             {
                height = 90;
                url = "https://i.ytimg.com/vi/mIW5trLZJcM/default.jpg";
                width = 120;
            };
            high =             {
                height = 360;
                url = "https://i.ytimg.com/vi/mIW5trLZJcM/hqdefault.jpg";
                width = 480;
            };
            medium =             {
                height = 180;
                url = "https://i.ytimg.com/vi/mIW5trLZJcM/mqdefault.jpg";
                width = 320;
            };
        };
        title = "talkshow chuong trinh hoi cho tet Binh Than o Miles Square Park";
    };
}]

【问题讨论】:

    标签: ios swift uiimage youtube-api


    【解决方案1】:

    根据经验,当您不知道字典键是否存在时,首选链接。这将防止由于尝试使用 nil 值强制解包选项而导致的崩溃。

    如果您的数据对象是所有 Swift 类型的嵌套字典,它会很简单:

    if let url = playListVideos_ARRAY[startOfNextIndexForVideos]["snippet"]?["thumbnails"]?["high"]?["url"] {
        // attempt to create the image using the successfully obtained url here
    }
    

    为了处理您的情况,我会尝试将 if let 语句分解为逗号分隔列表,将您的所有 as! 替换为 as?,并且仅在找到 url 键时才尝试创建图像:

    if let dict = playListVideos_ARRAY[startOfNextIndexForVideos] as? Dictionary<NSObject, AnyObject>,
        snippet = dict["snippet"] as? Dictionary<NSObject, AnyObject>,
        thumbnails = snippet["thumbnails"] as? Dictionary<NSObject, AnyObject>,
        high = thumbnails["high"] as? Dictionary<NSObject, AnyObject>,
        url = high["url"] as? Dictionary<NSObject, AnyObject> {
            // create your image with the url here
        } else {
            // do your thing with "2222222.."
        }
    

    【讨论】:

    • 我已经实现了一个解决方案,但我刚刚尝试了你的解决方案,结果相同,所以我会标记它:)
    【解决方案2】:

    是这样的吗

    if([yourarray valueForKey:@"thumbnails"]!=nil){
            NSLog("Key is found.");
        }
        else{
            NSLog("key is not found..playlist not available");
        }
    

    【讨论】:

      猜你喜欢
      • 2015-08-10
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 2020-07-13
      相关资源
      最近更新 更多