我所处的情况是,需要从视图控制器调用一个类方法,让它做它该做的事情,但只有在类方法完成后才能执行一些操作.

(我想我需要的是一个完成块,但如果我错了,请纠正我.)

情况如下:

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

问题是,我需要以特定的顺序创建这些对象,因为它们彼此依赖objectId的存在.问题是,取消弹出窗口的委托方法在单击submit后立即被调用,因为它是堆栈上的下一个.

保存解析对象时,调用如下所示的方法:

[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

推荐答案

当我想写一个块时,我总是用这个:

http://fuckingblocksyntax.com

EDIT

如果您正在写Swift,请使用以下命令:

http://fuckingswiftblocksyntax.com

如果以上链接因淫秽语言而无法打开,请使用此链接.

http://goshdarnblocksyntax.com/

Objective-c相关问答推荐

TWTweetComposeViewController 在 IOS6 中已弃用

UITableViewCell 突出显示时使标签的背景清晰

iOS 应用 Display Recorder 如何在不使用私有 API 的情况下录制屏幕?

dispatch_get_global_queue 和 dispatch_queue_create 有什么区别?

碰撞技术如何运作?

isEqualTo: 和 isEqual 之间的区别:

.m 文件中的空@interface 声明是做什么用的?

iOS 7 - 键盘动画

OSStatus 错误代码 -34018

dispatch_async(dispatch_get_main_queue(), ^{...});等到完成?

UITabBar 未在 ios 7 中显示所选项目图像

CFURLCopyResourcePropertyForKey 失败,因为通过 URL 没有方案

Cocoa 的依赖注入框架?

Xcode 在 iOS 8 中的 Main() 中引发异常,并带有所有异常断点

Cocoa 与 Cocoa Touch - 有什么区别?

从 UITabBarController 在当前上下文中呈现模态视图控制器后出现黑屏

如何设置 NSPredicate 来查找具有 nil 属性的对象

如何判断数组是空还是空?

通过情节提要加载时如何初始化视图?

如何删除 UIToolBar 上的顶部边框