私はRestKitから始めて、なんとかクエリを実行してTableViewControllerにロードしました。
クエリは、idTask、nameTask、および assignedUserId を返します。
ここまでは大丈夫、完璧に動作します。問題は、ユーザーの名前をその assignedUserID からロードしたいときに発生します (それは他の要求です)。
私は次のことを行います:
- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
[self.refreshControl endRefreshing];
NSLog(@"%d Tasks received", objects.count);
self.resultsArray = objects;
Task *task;
for (int i=0; i<self.resultsArray.count; i++){
task=(Task*) [self.resultsArray objectAtIndex:i];
task.user= [[User alloc]init];
[task.user getUserDetails:task.idUser];
}
[self.resultsTable reloadData];
}
ユーザーが自分のクラスを呼び出してデータをロードするタスクごとに、そのユーザーはクラスの作業でデータを利用できません。彼の属性は常に NULL です。
複数のオブジェクトをロードするにはどうすればよいですか?
Mi クラスのユーザーは次のようなものです: #import "User.h"
@implementation User
-(User *) getUserDetails:(NSNumber *)idUsuario{
[self loadUsersAssigned:idUsuario];
return self;
}
-(void) loadUsersAssigned:(NSNumber *)idUsuario
{
NSString *urlGetUser;
urlGetUser = [NSString stringWithFormat:@"MY URL", idUsuario,[[NSUserDefaults standardUserDefaults] objectForKey:@"userAccessToken"]];
//Load objects from url
RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[User class]];
//Set relations (keys)
[objectMapping mapKeyPath:@"id" toAttribute:@"idUser"];
[objectMapping mapKeyPath:@"first_name" toAttribute:@"name"];
[objectMapping mapKeyPath:@"last_name" toAttribute:@"lastName"];
RKObjectManager* manager = [RKObjectManager sharedManager];
[manager loadObjectsAtResourcePath:urlGetUser delegate:self block:^(RKObjectLoader* loader){
loader.objectMapping = objectMapping;
[loader setCachePolicy:RKRequestCachePolicyNone];
}];
}
- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
NSLog(@"Users recived: %d",objects.count);
NSArray *result = objects;
User *u = [result objectAtIndex:0];
self.idUser=u.idUser;
self.name=u.name;
self.lastName=u.lastName;
}
- (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error
{
// [self.refreshControl endRefreshing];
// NSLog(@"Error: %@", error.description);
}
@end
アップデート:
おっしゃるとおり、ブロックを使えばいいと思いますが、使ったことがないのでやり方がわかりません。
オブジェクトは正しいデータを返していますが、到着が遅すぎます。ログとコードを示します。
あなたが説明している方法でループを修正しました。それは次のようなものです:
int i=1;
for (Task *task in [self resultsArray]){
NSLog(@"--- begin iteration %d ---",i);
task.user= [[User alloc]init];
task.user =[task.user getUserDetails:[task idUser]];
NSLog(@"task inside objectLoader of Task id:%@ - name:%@ - lastname:%@",task.user.idUser,task.user.name,task.user.lastName);
NSLog(@"--- end iteration %d ---",i);
i++;
}
次に、ログに次のように表示されます。
2013-01-29 10:38:32.075 --- begin iteration 1 ---
2013-01-29 10:38:32.075 task inside objectLoader of Task id:(null) - name:(null) - lastname:(null)
2013-01-29 10:38:32.076 --- end iteration 1 ---
2013-01-29 10:38:32.076 --- begin iteration 2 ---
2013-01-29 10:38:32.077 task inside objectLoader of Task id:(null) - name:(null) - lastname:(null)
2013-01-29 10:38:32.078 --- end iteration 2 ---
2013-01-29 10:38:33.570 Users recived: 1
2013-01-29 10:38:33.570 Object loader of user: 522327,Xavi,Sanchez
2013-01-29 10:38:33.640 Users recived: 1
2013-01-29 10:38:33.640 Object loader of user: 522327,Xavi,Sanchez
ループが終了すると、ユーザー オブジェクトが読み込まれます。それ以前は、ユーザーのオブジェクトは null でした。ユーザーオブジェクトが読み込まれるまで待つには、ブロックなどを使用する必要があります。