NSOperation依赖操作和依赖对象

时间:2014-05-15 14:00:36

标签: ios objective-c cocoa-touch cocoa nsoperation

我有两个不同的NSOperation子类。一个从服务器下载订阅源,另一个解析。

@interface FeedDownloader:NSOperation
 @property(nonatomic, strong) NSString *downloadedFeed;
@end

@interface FeedParser:NSOperation
 @property(nonatomic, strong) NSString *feedToParse;
@end

然后,在我的“视图控制器”中,我将这些操作添加到NSOperationQueue并设置依赖关系。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
FeedDownloader *downloader = [[FeedDownloader alloc] init];
FeedParser *parser = [[FeedParser alloc] init];
[parser addDependency:downloader];
[downloader addObserver:self forKeypath: @"isFinished" context:kDownloaderContext];
[queue addOperation:downloader];
[queue addOperation:parser];

现在,我从下载器获得“KVO通知”,表示已完成下载Feed。下载完成后和开始解析之前,我如何将下载的源传递给解析器。

2 个答案:

答案 0 :(得分:1)

FeedParser课程中,您可以确保isReady不成立,直到设置了所需的数据为止 - 这样操作就不会过早开始,直到它有#39} ; s依赖。

有很多方法可以做到这一点 - 我想到的第一件事就是使用下载操作的完成块

__weak __typeof(parser)     weakParser     = parser;
downloader.completionBlock = ^{
  weakParser.feedToParse = downloader.downloadedFeed;
};

答案 1 :(得分:0)

您可以声明一个协议,可能是FeedProvider,它有一个FeedParser可以请求Feed字符串的方法。让FeedDownloader采用FeedProvider。授予FeedParser provider类型id <FeedProvider>的属性。在创建时,为parser对象提供对downloader对象的引用作为其提供者。