ios 5.1 中的自动刷新 uiviewcontroller

Posted

技术标签:

【中文标题】ios 5.1 中的自动刷新 uiviewcontroller【英文标题】:autorefreshing uiviewcontroller in ios 5.1 【发布时间】:2013-12-04 14:53:51 【问题描述】:

我有一个UIViewController,它显示在我的 Iphone 应用程序上完成的计算的进度状态,以查看我需要在同一 UIViewController 上按下名为刷新的按钮的进度百分比,我该怎么做无需手动按下按钮即可自动完成

这是我的代码:

- (void)viewDidLoad
    [NSThread detachNewThreadSelector:@selector(autoRefresh) toTarget:self withObject:nil];
    ...

然后:

- (void) autoRefresh
    while (1) 
        sleep(2);
        sendFromButton = false;
        if (flag == 1)  // which button pushed last
            [self CaptureButton:self];
        
        if (flag == 2)  // which button pushed last
            [self ExampleButtonfun:self];
        
        if (flag == 3)  // which button pushed last
            [self CommuintyButton:self];
        
     

当第一次查看控制器时,调用 viewDidLoad 会创建一个线程来运行自动刷新功能,但是尽管我以正确的方式进行了操作,但该控制器并未刷新!请帮助我那个。

【问题讨论】:

我也有同样的问题!!! 也许线程在完成之前没有显示任何东西,这是我从重试中得出的结论! 为什么不用块? @MatthieuRouif 使用块是什么意思?! 请注意,您可能还需要在主线程上执行任何 UI 更新操作。 【参考方案1】:

如果您想进行一系列计算并显示进度,您必须在后台线程中进行计算,然后在主线程上更新 UI。如果您在主线程中进行计算,您的 UI 将永远没有机会自我更新。

但是,假设您已经在后台线程上成功启动了耗时计算,那么您可以使用计时器(或显示链接)来更新进度条,例如,定义计时器属性:

@property (nonatomic, weak) NSTimer *timer;

然后从主队列中安排一个重复计时器并启动您的后台进程:

// start the timer

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 
                                                  target:self
                                                selector:@selector(updateProgress:) 
                                                userInfo:nil
                                                 repeats:YES];
self.timer = timer;

// use whatever mechanism you want for initiating your background process (though dispatch queues and operation queues may be easier than dealing with threads directly)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    [self startTimeConsumingProcess]
);

然后你显然会实现一个 updateProgress: 方法来更新你的 UI:

- (void)updateProgress:(NSTimer *)timer

    // update the UI progress bar here

当你的计算完成或视图被关闭时不要忘记invalidate那个定时器,因为如果你不这样做,定时器将保持对你的视图控制器的强引用,你将拥有一个强引用循环(又名保留循环)。


顺便说一句,另一种逻辑方法是让后台计算调度 UI 更新,将进度条更新回主队列,而不是使用计时器,例如

- (void) startSomeTimeConsumingProcess

    // start time consuming process in background queue

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^

        BOOL finished = NO;

        while (!finished)
        
            // do something, updating `finished` when done

            // update UI to report the progress in the main queue, though:

            dispatch_async(dispatch_get_main_queue(), ^
                // update progress UI here
            );
        
    );

这种方法的唯一考虑是这个后台进程以多快的速度调度主队列并更新进度条。如果它更新得太快,您可以用进度更新积压主队列。因此,上述基于计时器(或显示链接)的方法的吸引力。但是,如果您确信这些更新将足够缓慢地进行,那么这种替代方法可能会更容易。

【讨论】:

以上是关于ios 5.1 中的自动刷新 uiviewcontroller的主要内容,如果未能解决你的问题,请参考以下文章

在 xcode 5 中部署目标 5.1 时如何使用自动布局

XCode 4.4 iOS 5.1 模拟器问题

如何在 CollectionView iOS 中停止自动重新加载和刷新图像

从 iOS 13 中的呈现模式拉动以刷新表格视图不起作用

mint-ui在iOS中点击键盘会自动刷新页面

iOS中的简单对象拖动