【问题标题】:NSOperation dependent operation and dependent objectsNSOperation 依赖操作和依赖对象
【发布时间】:2014-05-15 14:00:36
【问题描述】:

我有两个不同的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 通知”,它已完成下载源。下载完成后并开始解析之前,我如何将下载的提要传递给解析器。

【问题讨论】:

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


    【解决方案1】:

    在您的 FeedParser 类中,您可以确保 isReady 在设置所需数据之前不为真 - 这样操作在具有依赖项之前不会过早启动。

    有很多方法可以做到这一点——我首先想到的是使用下载操作的完成块

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 2019-03-06
        • 2020-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        相关资源
        最近更新 更多