循环直到两个对象/图像不匹配

时间:2014-07-09 20:10:20

标签: ios objective-c function loops

我遇到循环问题。我有一个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过滤....所以我不能使用预先准备。

我不确定我是否会按逻辑/正确的方式进行此操作。任何人都可以帮我解释我出错的地方吗?

2 个答案:

答案 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;
}