gpt4 book ai didi

ios - 如何编写 Objective-C 完成 block

转载 作者:IT老高 更新时间:2023-10-28 11:48:35 25 4
gpt4 key购买 nike

我的情况是需要从我的 View Controller 调用一个类方法,让它做它的事情,但只有在类方法完成后才执行一些操作。

(我认为我需要的是一个完成 block ,但如果我错了,请纠正我。)

情况如下:

我将 Parse.com 用于我的应用后端。当用户注册帐户时,他们会在弹出窗口中输入他们的姓名、公司和其他一些信息,然后单击提交。提交按钮链接到一个类方法(如下所示),该方法获取他们的 PFUser 对象和公司名称并创建一些数据库对象。函数完成后,使用委托(delegate)关闭弹出窗口。

问题是我需要以特定顺序创建这些对象,因为它们相互依赖于 objectId 的存在。问题是,关闭弹出窗口的委托(delegate)方法在单击提交后立即被调用,因为它是堆栈中的下一个。

当保存一个 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.
}];

所以,我需要弄清楚如何执行以下操作:(我敢肯定,与方 block 有关的一切都是完全错误的)

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

最佳答案

当我想写一个 block 时,我总是使用它:

http://fuckingblocksyntax.com

编辑

如果您正在编写 Swift,请使用以下代码:

http://fuckingswiftblocksyntax.com

如果由于淫秽语言而无法打开上述链接,请使用此链接。

http://goshdarnblocksyntax.com/

关于ios - 如何编写 Objective-C 完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21436831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com