2013-01-16 72 views
0

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

下面是从ContentManagerFetchRequest

- (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 
    } 
}]; 

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

回答

0

我会让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 <ContentManagerDelegate>和在实施中,你应该能够实现didFetchResults:方法,将给你的结果,并在该方法中,您可以停止从动画活动指标。

+0

你是我的英雄! – sixstatesaway

+0

不客气:) – codingNinja