如何让ui始终响应并进行后台更新?

Pra*_*n S 2 iphone cocoa asynchronous objective-c

我正在创建一个应用程序,每页显示8个缩略图,它可以有n页.这些缩略图中的每一个都是UIViews并添加到UIScrollView中.但是我已经使用Apple示例代码实现了Paging.

问题:

  1. 每个缩略图(UIView)创建150毫秒并添加到滚动视图
  2. 因此,对于3页,创建并添加到UI Scrollview需要花费大量时间.
  3. 此时滚动视图不是非常响应,并且非常生涩并且给用户带来不好的体验
  4. 如何创建缩略图并将其添加到UIScrollview而不影响触摸响应?我希望它们独立于主线程运行,主线程可以处理触摸事件(我想).

另外我想提一下,当创建缩略图时,我会触发图像的异步下载,并在下载完成时调用委托方法.

让我知道我必须使选项更具响应性和更新UI而不影响触摸操作的选项.页面控件适用于延迟加载缩略图网格.

TIA,

Praveen S.

Kaz*_*oto 10

Grand Central Dispatch易于用于后台加载.但GCD仅适用于iOS4之后.如果你必须支持iOS3,performSelectorInBackground/performSelectorOnMainThread或NSOperationQueue是有帮助的.

并且,要小心几乎UIKit类不是线程安全的,除非绘制到图形上下文.例如,UIScrollView不是线程安全的,UIImage imageNamed:不是线程安全的,但是UIImage imageWithContentsOfFile:是线程安全的.

dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_queue_t concurrentQueue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(concurrentQueue, ^{

    dispatch_apply([thumbnails count], concurrentQueue, ^(size_t index) {

        Thumbnail *thumbnail = [thumbnails objectAtIndex:index];
        thumbnail.image = [UIImage imageWithContentsOfFile:thumbnail.url];

        dispatch_sync(mainQueue, ^{

            /* update UIScrollView using thumbnail. It is safe because this block is on main thread. */

        });
    }

    /* dispatch_apply waits until all blocks are done */

    dispatch_async(mainQueue, ^{
        /* do for all done. */
    });
}
Run Code Online (Sandbox Code Playgroud)