Iphone UIScrollView异步填充的对象设计帮助
大家好 我是Cocoa的新手,任务是为运行4.2的iPhone和iPad开发一个原型应用程序。我在设计将数据回填到用于填充UIScrollView的自定义对象的过程时遇到问题。每个自定义对象都显示电影数据(艺术品、演员等),这些数据从REST服务调用 我希望这个电影对象负责它的渲染,因此将它的数据需要“分包”到一个单独的对象,该对象可以执行实际的REST调用、JSON解析等。我一直在尝试使用委托、NSOperation或直接回调来提供解决方案,但我很难辨别该走哪条路 我知道我需要在后台处理这些数据,以使UI在主线程上保持活动状态,但我很难设计这些对象之间的连接:Iphone UIScrollView异步填充的对象设计帮助,iphone,objective-c,multithreading,concurrency,Iphone,Objective C,Multithreading,Concurrency,大家好 我是Cocoa的新手,任务是为运行4.2的iPhone和iPad开发一个原型应用程序。我在设计将数据回填到用于填充UIScrollView的自定义对象的过程时遇到问题。每个自定义对象都显示电影数据(艺术品、演员等),这些数据从REST服务调用 我希望这个电影对象负责它的渲染,因此将它的数据需要“分包”到一个单独的对象,该对象可以执行实际的REST调用、JSON解析等。我一直在尝试使用委托、NSOperation或直接回调来提供解决方案,但我很难辨别该走哪条路 我知道我需要在后台处理这些数
TheaterViewController //ViewController that contains the UIScrollView
目前,我正在使用11个(任意分配)MovieView项目填充TheaterViewController的UIScrollView-MovieView显示一个ActivityIndicator,让用户知道它正在交付内容
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检查数据仓库的内容,如果不存在,则调用REST服务。我不知道怎么做,就是通知/callback/post到MovieView,DataAgent已经完成了数据的获取(最好是以异步方式),这样它就可以呈现完成的视图了
有人能给我指出一个文档或例子来完成这种异步回调过程吗
提前感谢你们这些好心人提出的任何建议-委派绝对是一个好办法。我将创建一个
DataAgentDelegate
协议,其中包含一个@required
方法,称为-(void)dataFetchComplete
。将按以下方式实施:
在DataAgent.h中
@interface DataAgent : NSObject {
id<DataAgentDelegate> delegate;
}
@property (nonatomic, retain) id<DataAgentDelegate> delegate;
在电影视图中
@interface MovieView : NSObject <DataAgentDelegate> {
//...
}
我想不出任何具体的示例程序,但这是一件非常常见的事情。在处理异步事件时,委托非常方便。我希望这有帮助 阿曼-谢谢你的回复。我将把这个解决方案插入我的源代码中,看看它是如何运行的。我还介绍了利用dispatch\u get\u global\u queue()的基于GCD的解决方案。
@interface MovieView : NSObject <DataAgentDelegate> {
//...
}
- (void) startDataFetch {
DataAgent *dataAgent = [[DataAgent alloc] init];
dataAgent.delegate = self;
[dataAgent startFetching];
}
- (void) dataFetchComplete {
//render fetched assets in view
}