Ios 在循环执行期间更改UIImageView UIImage

Ios 在循环执行期间更改UIImageView UIImage,ios,swift,Ios,Swift,我有一个函数,它使用视频作为avurlast,并按时间间隔剪切视频。我还有一个名为previewImageView的UIImageview IBOutlet,我希望在执行函数时更改图像。此函数在viewDidLoad中调用。previewImageView似乎仅在函数完成执行后设置。下面是我的代码 func getImagesAtInterval(url: NSURL){ let asset : AVURLAsset = AVURLAsset(URL: url, options: ni

我有一个函数,它使用视频作为avurlast,并按时间间隔剪切视频。我还有一个名为previewImageView的UIImageview IBOutlet,我希望在执行函数时更改图像。此函数在viewDidLoad中调用。previewImageView似乎仅在函数完成执行后设置。下面是我的代码

func getImagesAtInterval(url: NSURL){

    let asset : AVURLAsset = AVURLAsset(URL: url, options: nil)
    let duration : CMTime = asset.duration
    let totalTime = Int(CMTimeGetSeconds(duration) * 1000)
    let assetGenerator : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)

    imageSet = [UIImage]()
    var value = 0

    for var i : Int = 0; i < totalTime; i+=200 {

        let time : CMTime = CMTimeMake(Int64(value), 1000)
        var imageRef : CGImageRef!
        do {
            imageRef = try assetGenerator.copyCGImageAtTime(time, actualTime: nil)
        } catch let error as NSError {
            print("Image generation failed with error \(error)")
        }
        if let image : UIImage? = UIImage(CGImage: imageRef){
            dispatch_async(dispatch_get_main_queue()) {

//I would like to see the images in the previewImageView 
//change as the loop operates.
                self.previewImageView.image = image
            }
            imageSet.append(image!)
        }           
        value += 200
    }
}
func getImagesInterval(url:NSURL){
let-asset:avurlaste=avurlaste(URL:URL,选项:nil)
let duration:CMTime=asset.duration
让totalTime=Int(CMTimeGetSeconds(持续时间)*1000)
让assetGenerator:AVAssetImageGenerator=AVAssetImageGenerator(资产:资产)
图像集=[UIImage]()
var值=0
对于变量i:Int=0;i

我已尝试按照参考资料中的建议执行操作,您需要使图像无效,以便它立即刷新。 只需调用UIView的
setNeedsDisplay()
函数

dispatch_async(dispatch_get_main_queue()) 
{
  self.previewImageView.image = image
  self.previewImageView.setNeedsDisplay()
}

改用
CADisplayLink
,它将尝试与屏幕刷新同步

这里有一些Objective-C代码,我将把它作为练习留给读者,让他们将其转换为Swift

// call this method when you want to start updates
- (void)startUpdates
{
    _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(doFrame)];
    _displayLink.frameInterval = 1;
    [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}

// I'll let you guess
- (void)stopUpdates
{
    [_displayLink invalidate];
    _displayLink = nil;
}

// In this method, do any needed updates.
// Note that it will not necessarily be called every single frame,
// so check actual time to decide what to display
- (void)doFrame
{
}

我通过在viewDidLoad的后台线程中调用getImageAtInterval方法并在UIThread:)中调用“previewImageView.image=image”解决了这个问题。

感谢您的回复,虽然它似乎不起作用,但也许我没有给足够的时间来绘制图像?我希望在生成图像时,预览图像视图的图像也将更改,直到循环结束。对不起,我更新了我的答案。它应该是函数setNeedsDisplay。干杯。仍然不起作用,请查看更新的问题与链接,并告诉我你的想法,干杯延迟屏幕更新一次完成所有操作控制传递回运行循环。改用
CADisplayLink
,它将调用您在屏幕更新时提供的方法。感谢您的回复,我将代码转换为swift,但它似乎不起作用。我在进入GetImageSatiInterval函数时调用了startUpdating,在循环之后调用了StopUpdate(外部)。在doframe中,我将previewImageView图像设置为imageSet.last,因为imageSet是uiimages数组。这不起作用。所有这些都发生在同一个线程上,因此很明显,如果您继续占用线程上的CPU,那么其他事情就不会发生。您需要检索图像并在中显示它们doFrame@DrPatience,如果答案对你有帮助,请随意投票和/或接受。