我遇到循环问题。我有一个imageView
显示艺术家的图像,另一个imageView
我想要显示随机歌曲的艺术作品。但是,此作品必须与艺术家图片不匹配。 [清理事物 - 艺术家形象是歌曲的艺术作品之一] 。
我想在Objective-C for iPhone中写这个:
做{
在
中获取随机歌曲的作品songsArray
直到{
image1!= image2;
}
这是我到目前为止所尝试的内容(firstArtwork
是艺术家的图像,secondArtwork
是随机选择的艺术作品,不得与firstArtwork
< /强>)。
-(UIImage *)getSecondImage{
MPMediaItemArtwork *firstArtwork = [self.mediaItem valueForProperty:MPMediaItemPropertyArtwork];
// Choose random song in songsArray + get Artwork
MPMediaItem *myItem = [songTracks objectAtIndex:arc4random() % songsArray.count];
MPMediaItemArtwork *secondArtwork = [myItem valueForProperty:MPMediaItemPropertyArtwork];
// Get images
UIImage *firstImage = [firstArtwork imageWithSize:CGSizeMake(1, 1)];
UIImage *secondImage = [secondArtwork imageWithSize:CGSizeMake(1, 1)];
// IF the two images are the same, repeat this block
// IF NOT, return secondImage
if ([firstImage isEqual:secondImage]){
[self getSecondImage];
}
else{
return secondImage;
}
return secondImage;
}
但这有时会返回与艺术家图像相同的图像。
我也尝试过使用NSPredicate
,但是我得到的错误是你无法使用MPMediaItemPropertyArtwork过滤....所以我不能使用预先准备。
我不确定我是否会按逻辑/正确的方式进行此操作。任何人都可以帮我解释我出错的地方吗?
答案 0 :(得分:0)
我认为问题在于您的return
值。请注意,检查2个图像的值的if
语句实际上并未更改返回到初始方法调用程序的任何内容。此外,您的else
语句无效,因为您的if
语句是否为真,它将返回secondImage
。你需要做这样的事情:
if ([firstImage isEqual:secondImage]){
secondImage = [self getSecondImage];
}
return secondImage;
这样,您可以更新返回给初始调用者的值。
答案 1 :(得分:0)
长话短说:你的伪代码是正确的(一个简单的循环),但你的实现包含递归,这在这种情况下是不必要的复杂IMO(似乎你不太确定你在做什么)
-(UIImage *)getSecondImage{
MPMediaItemArtwork *firstArtwork = [self.mediaItem valueForProperty:MPMediaItemPropertyArtwork];
UIImage *firstImage = [firstArtwork imageWithSize:CGSizeMake(1, 1)];
UIImage *secondImage = nil;
do {
// Choose random song in songsArray + get Artwork
MPMediaItem *myItem = [songTracks objectAtIndex:arc4random() % songsArray.count];
MPMediaItemArtwork *secondArtwork = [myItem valueForProperty:MPMediaItemPropertyArtwork];
// Get image
secondImage = [secondArtwork imageWithSize:CGSizeMake(1, 1)];
// IF the two images are the same, repeat this loop
// IF NOT, return secondImage
} while ([firstImage isEqual:secondImage]);
return secondImage;
}