帮助UIScrollView的异步种群的对象设计

时间:2010-12-04 22:05:07

标签: iphone objective-c multithreading concurrency

问候集体,

我是Cocoa的新手,他的任务是处理运行4.2的iPhone和iPad的原型应用程序。我在设计一个将数据回填到我用来填充UIScrollView的自定义对象的进程时遇到了问题。每个自定义对象都显示电影数据(插图,演员等),并且这些数据是从REST服务调用的。

我希望这个Movie对象负责它的渲染,因此将其数据需要“移植”到一个单独的对象,该对象可以进行实际的REST调用,JSON解析等等。我一直试着把它包裹起来使用代表,或NSOperation或直接回调来提供解决方案,但我无法辨别出追求的途径。

我知道我需要在后台处理这些数据,以保持UI在主线程上保持活跃,但我很难设法如何设计这些对象之间的连接:

TheaterViewController //ViewController that contains the UIScrollView

目前,我正在使用11个(任意分配)MovieView项目填充TheaterViewController的UIScrollView - MovieView显示一个ActivityIndi​​cator,让用户知道它正在处理提供内容

MovieItem  //a single movie and it's respective data

MovieView  //individual View that displays a single MovieItem content

DataAgent  //background-capable object that fetches data from app server

DataWarehouse //Singleton-designed class that maintains an NSMutableArray of MovieItem's

在我目前的设计中,TheaterViewController使用11个MovieView填充UIScrollView。然后每个MovieView都会获取自己的数据。我知道如何让DataAgent检查DataWarehouse的内容,如果不存在,则调用REST服务。我不知道怎么做,是通知/回调/发布到MovieView,DataAgent已经完成了数据的获取(最好以异步方式),这样它就可以渲染完成的视图。

有人能指出一个文档,或做这种异步回调过程的例子吗?

提前感谢你们提出的任何指示 -

1 个答案:

答案 0 :(得分:0)

代表团肯定是一条很好的路线。我会制作一个DataAgentDelegate协议,其中包含一个名为@required的{​​{1}}方法。它将全部实现如下:

在DataAgent.h中

-(void)dataFetchComplete

在DataAgent.m

@interface DataAgent : NSObject {
    id<DataAgentDelegate> delegate;
}

@property (nonatomic, retain) id<DataAgentDelegate> delegate;

在MovieView.h中

- (void) fetchingComplete {
    if (delegate != nil) {
        [delegate dataFetchComplete];
    }
}

在MovieView.m

@interface MovieView : NSObject <DataAgentDelegate> {
    //...
}

我想不出任何具体的示例程序,但这是很常见的事情。当您处理异步事件时,委派非常方便。我希望这有帮助!