6

UITableViewController従業員でいっぱいのテーブルの表示を担当する があります。このデータは、parse.com のデータベースに保存されています。

これは私UITableViewControllerの で、ストアを開始しただけです。

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nil bundle:nil];
    if(self){
        store = [[EmployeeStore alloc] init]; 
    }
    return self;
}

これはEmployeeStore、従業員を照会する init メソッドです。

-(id) init{
    self = [super init];
    if(self){
        employees = [[NSMutableArray alloc] init];
        [self fetchEmployeesFromDatabase];
    }
    return self;
}

fetchEmployeesFromDatabase、ここで従業員を照会します。

-(void) fetchEmployeesFromDatabase{
    PFQuery *query = [PFQuery queryWithClassName:@"Employee"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            // The find succeeded.
            NSLog(@"Successfully retrieved %d scores.", objects.count);
            // Do something with the found objects
            for (PFObject *object in objects) {
                NSLog(@"%@", object.objectId);
                [employees addObject:object]; 
            }
        } else {
            // Log details of the failure
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];
}

私はそれらを正常に受信していますが、問題はクエリがバックグラウンドで実行され、テーブル ビューの読み込みが完了するまで終了しないため、テーブル ビューにデータが入力されないことです。クエリの完了後にテーブルにデータをリロードする必要がありますが、どうすればよいですか?

4

5 に答える 5

11

UITableViewController

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nil bundle:nil];
    if(self){
        store = [[EmployeeStore alloc] init];
        store.tableView = self.tableView; 
    }
    return self;
}

EmployeeStore.h

@property (nonatomic, strong) UITableView *tableView;

EmployeeStore.m

-(id) init{
    self = [super init];
    if(self){
        employees = [[NSMutableArray alloc] init];
        [self fetchEmployeesFromDatabase];
    }
    return self;
}

および fetchEmployeesFromDatabase

-(void) fetchEmployeesFromDatabase{
    PFQuery *query = [PFQuery queryWithClassName:@"Employee"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            // The find succeeded.
            NSLog(@"Successfully retrieved %d scores.", objects.count);
            // Do something with the found objects
            for (PFObject *object in objects) {
                NSLog(@"%@", object.objectId);
                [employees addObject:object]; 
            }

             dispatch_async(dispatch_get_main_queue(), ^ {
                [self.tableView reloadData];
              });

        } else {
            // Log details of the failure
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];
}
于 2013-06-27T06:17:12.327 に答える
2

読み込みが完了したら、テーブル ビューに再読み込みを指示します。

if (!error) {
    // The find succeeded.
    NSLog(@"Successfully retrieved %d scores.", objects.count);
    // Do something with the found objects
    for (PFObject *object in objects) {
        NSLog(@"%@", object.objectId);
        [employees addObject:object]; 
    }

    dispatch_async(dispatch_get_main_queue(), ^ {
        [tableView reloadData];
    });
} else {

従業員ストアがスレッド セーフであるか、バックグラウンド スレッドとメイン スレッドが同時にアクセスしないようにする必要があります。

于 2013-06-27T06:06:41.503 に答える
0
-(void) fetchEmployeesFromDatabase{
PFQuery *query = [PFQuery queryWithClassName:@"Employee"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        // The find succeeded.
        NSLog(@"Successfully retrieved %d scores.", objects.count);
        // Do something with the found objects
        for (PFObject *object in objects) {
            NSLog(@"%@", object.objectId);
            [employees addObject:object]; 
        }
    } else {
        // Log details of the failure
        NSLog(@"Error: %@ %@", error, [error userInfo]);
    }
    [self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:NO];
}];
}

-(void)reloadTableView{
    [self.aTableview reloadData];
}

次に、テーブルビューをメインスレッドにロードします。これを試して。

于 2013-06-27T06:15:34.387 に答える
0

ここでは、テーブル ビューが完了する前であっても、データがテーブルに取り込まれます。ここで行う必要があるのは、ステートメント [self fetchEmployeesFromDatabase];を配置することだけです。viewDidLoad() メソッド内、またはテーブル作成を呼び出すメソッド内。

于 2013-06-27T06:46:17.890 に答える