【问题标题】:Completion block/callback on FetchRequest completionFetchRequest 完成时的完成块/回调
【发布时间】:2013-01-16 13:57:06
【问题描述】:

我的模型类中有一个FetchRequest,名为ContentManager。它会获取大量数据,因此在完成之前屏幕是空白的。在显示获取结果的ViewController 中,我想显示一个加载指示器,所以我想在FetchRequest 完成时获得一个回调并将其传递给ViewController 以停止加载指示器。这可能吗?

这是来自ContentManager 类的FetchRequest

- (NSArray*)recipesForMagazine
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    NSString* path = [[NSBundle mainBundle] pathForResource:@"magazine_recipe_guids" ofType:@"plist"];
    NSArray* recipeGuids = [NSArray arrayWithContentsOfFile:path];

    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"guid IN %@",recipeGuids];
    [request setPredicate:predicate];

    NSSortDescriptor* sort = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
    [request setSortDescriptors:[NSArray arrayWithObject:sort]];

    [sort release];

    NSError* error = nil;
    NSArray* fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
    [request release];

    return fetchResults;        
}

这里我设置在ViewController

self.magazineRecipes = [[ContentManager defaultManager] recipesForMagazine];

我想这样设置 fetchrequest 方法:

- (NSArray*)recipesForMagazine:(void (^)(BOOL success))block什么的,所以在viewcontroller我可以这样称呼它

self.magazineRecipes = [[CTContentManager defaultManager] recipesForMagazine:^(BOOL success) {
    if (success) {
        //stop activity indicator view
    }
}];

我不知道我的思维方式是否正确,提前感谢您的帮助!

【问题讨论】:

    标签: iphone ios objective-c callback nsfetchrequest


    【解决方案1】:

    我会让 viewController 成为 ContentManager 类的委托。所以在ContentManager.h 我会做这样的事情:

        @protocol ContentManagerDelegate()
          -(void) didFetchResults:(NSArray *) results;
          -(void) didResultsFail: (NSError *) error;
        @end
    
        @interface ContentManager : <SuperClass Name>
        -(id) initWithDelegate: (id<ContentManagerDelegate>) delegate;
        @property (nonatomic, strong) id<ContentManagerDelegate> delegate;
        @end
    

    在实现中:

       -(id) initWithDelegate: (id<ContentManagerDelegate>) delegate
        {
            self = [super init];
            if(self)
            {
               _delegate = delegate;
             }
            return self;
        }
    

    在您的recipesForMagazine 方法中,您可以使用委托[_delegate didFetchResults: fetchResults],如果您愿意,您也可以实现一个将错误传递给委托的方法。在您的ViewController.h 中执行@interface ViewController.h : UIViewController &lt;ContentManagerDelegate&gt; 并且在实现中您应该能够实现didFetchResults: 方法,该方法将为您提供结果,并且在该方法中您可以停止活动指示器的动画。

    【讨论】:

      猜你喜欢
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多