Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UIScrollView异步填充的对象设计帮助_Iphone_Objective C_Multithreading_Concurrency - Fatal编程技术网

Iphone UIScrollView异步填充的对象设计帮助

Iphone UIScrollView异步填充的对象设计帮助,iphone,objective-c,multithreading,concurrency,Iphone,Objective C,Multithreading,Concurrency,大家好 我是Cocoa的新手,任务是为运行4.2的iPhone和iPad开发一个原型应用程序。我在设计将数据回填到用于填充UIScrollView的自定义对象的过程时遇到问题。每个自定义对象都显示电影数据(艺术品、演员等),这些数据从REST服务调用 我希望这个电影对象负责它的渲染,因此将它的数据需要“分包”到一个单独的对象,该对象可以执行实际的REST调用、JSON解析等。我一直在尝试使用委托、NSOperation或直接回调来提供解决方案,但我很难辨别该走哪条路 我知道我需要在后台处理这些数

大家好

我是Cocoa的新手,任务是为运行4.2的iPhone和iPad开发一个原型应用程序。我在设计将数据回填到用于填充UIScrollView的自定义对象的过程时遇到问题。每个自定义对象都显示电影数据(艺术品、演员等),这些数据从REST服务调用

我希望这个电影对象负责它的渲染,因此将它的数据需要“分包”到一个单独的对象,该对象可以执行实际的REST调用、JSON解析等。我一直在尝试使用委托、NSOperation或直接回调来提供解决方案,但我很难辨别该走哪条路

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

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 
}