0

というFetchRequest名前のモデル クラスに がありContentManagerます。かなりの量のデータを取得するため、完了するまで画面は空白になります。取得したViewController結果を表示する で読み込みインジケータを表示したいので、FetchRequestが完了したときにコールバックを取得し、それを に渡してViewController読み込みインジケータを停止させたいと思います。これは可能ですか?

クラスFetchRequestからは次のとおりです。ContentManager

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

私の考え方が正しいかどうかはわかりませんが、事前に助けてくれてありがとう!

4

1 に答える 1

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.hdoと実装では、結果を提供するメソッド@interface ViewController.h : UIViewController <ContentManagerDelegate>を実装できるはずです。そのメソッドでは、アクティビティインジケーターのアニメーション化を停止できます。didFetchResults:

于 2013-01-16T15:18:03.347 に答える