2013-01-16 70 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