我处于这样一种情况,需要从我的视图控制器调用一个类方法,让它执行完其任务后再执行一些操作,但这些操作仅在该类方法完成后才能执行。
(我认为我需要的是一个完成块,如果我错了,请指出。)
这就是情况:
我正在使用 Parse.com 作为我的应用程序后端。当用户注册帐户时,他们在弹出窗口中输入姓名、公司和其他一些信息,然后单击提交。提交按钮连接到一个类方法(如下所示),该方法接受他们的 PFUser 对象和公司名称,并创建一些数据库对象。该函数完成后,使用委托关闭弹出窗口。
问题是,我需要按特定顺序创建这些对象,因为它们依赖于彼此的 objectId 是否存在。问题是,关闭弹出窗口的委托方法会立即在单击提交后调用,因为它是堆栈上的下一个方法。
保存 Parse 对象时,需要调用一个类似于以下代码的方法: (这是我希望写的代码,我认为它可以解决我的问题)
[someParseObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
// Code here runs AFTER the method completes.
// This also happens on another thread which
// I'd like to implement as well.
}];
所以,我需要弄清如何做类似以下的事情: (我相信与该方块有关的所有内容都是完全错误的)
(与这个块有关的所有内容肯定是完全错误的)
SignUpViewController.m
myUserOrg *userOrg = [myUserOrg object]; // myUserOrg = Custom PFObject Subclass
// My method that takes in a user object and a string, creates
// the database objects in order.
[userOrg registerNewUserOrgWithUser:(PFUser*) andCompanyName:(NSString*) companyName withBlock(somethingHere)block {
if(error) {
NSLog(@"Unable to create org!");
} else {
NSLog(@"Created Org!");
[self.delegate dismissSignupView];
}
如果您需要额外的信息或澄清,请告知我。
先行致谢!
--------- 编辑一 ----------
好的,所以几个相当大的时间单位之后,这就是我想出来的。整个实现可能更简单,可以减少很多 API 调用,但我会努力改进。还有其他一些明显的问题,但这是第一步。
方法调用:
[testOrg registerNewUserOrgWithUser:currentUser
creatingOrgContactWithName:@"MyBigHappy Corp."
withBlock:^(BOOL succeeded, NSError *error) {
if (error) {
NSLog(@"Not working");
} else {
NSLog(@"Working!");
}
}];
方法实现:
@implementation MYUserOrg
@dynamic orgContact;
@dynamic orgDisplayName;
@dynamic members;
@dynamic contacts;
+ (NSString *)parseClassName {
return @"MYUserOrg";
}
dispatch_queue_t NewUserOrgRegistrationQueue;
-(void)registerNewUserOrgWithUser:(MYUser*)user
creatingOrgContactWithName:(NSString*) orgContactName
withBlock:(MYBooleanResultBlock) block {
NewUserOrgRegistrationQueue = dispatch_queue_create("com.myapp.initialOrgCreationQueue", NULL);
dispatch_async(NewUserOrgRegistrationQueue, ^{
NSMutableArray *errors = [[NSMutableArray alloc] init];
// Initial org save to generate objectId
NSError *orgSaveError = nil;
[self save:&orgSaveError];
if (orgSaveError) {
[errors addObject:@"Initial Org save Failed"];
}
// Create and Relate Org Contact
NSError *saveOrgContactError = nil;
MYontact *orgContact = [MYContact object];
[orgContact setContactType:MYContactTypeUserOrganization];
[orgContact setDisplayName:orgContactName];
[orgContact setParentOrg:self];
[orgContact save:&saveOrgContactError];
if (saveOrgContactError) {
[errors addObject:@"Saving Org Contact Failed"];
} else {
// If Org contact saved, set it;
[self setOrgContact:orgContact];
}
// Create amd Relate User Contact
NSError *saveUserContactError = nil;
MYContact *userContact = [MYContact object];
[userContact setFirstName:user.firstName];
[userContact setLastName:user.lastName];
[userContact setContactType:MYcontactTypeUser];
[userContact setParentOrg:self];
[userContact save:&saveUserContactError];
if (saveUserContactError) {
[errors addObject:@"Saving user contact failed"];
}
NSError *saveUserError = nil;
[user setParentOrg:self];
[user setUserContact:userContact];
[user save:&saveUserError];
if (saveUserError) {
[errors addObject:@"Saving User failed"];
}
// Return if block succeeded and any errors.
NSError *error = nil;
BOOL succeeded;
if (errors.count > 0) {
NSDictionary *userInfo = @{@"error" : errors};
errors = [NSError errorWithDomain:@"MyAppErrorDomain"
code:1
userInfo:userInfo];
succeeded = NO;
} else {
succeeded = YES;
}
block(succeeded, error);
});
}
@end
saveAllInBackground:block:
,看看是否可以只做一个保存并从该块中解除。你可能不需要定义自己的块,只需使用Parse SDK调用的块即可。 - Wain