如何编写一个Objective-C完成块

安德鲁

我处于一种需要从我的视图控制器调用类方法的情况下,确实要这样做,但是只有在类方法完成后才执行一些操作。

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

情况如下:

我将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
CW0007007

当我要编写一个块时,我总是使用它:

http://fuckingblocksyntax.com

编辑

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

http://fuckingswiftblocksyntax.com

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

http://goshdarnblocksyntax.com/

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可以从Objective-C使用的带有完成块的方法

如何在Objective-C iOS中等待完成块完成

如何创建与Objective-C完成块等效的C ++作为参数

如何在Obj C中编写没有完成块的异步方法的单元测试

如何在objective-c中的完成块上传递参数

如何调用完成块?

iOS / Objective-c:从完成块或闭包异步返回值到调用函数

在Objective-C中使用带有可为空的String值的Swift完成块

是否可以将完成块传递给Objective-C中的委托参数?

如何写可为空的完成块?

我有一个用Objective-c编写的iOS应用程序,还有一个带有WooCommerce的Wordpress网站。如何连接它们?

如何从用Objective-C编写的另一个控制器引用或调用用Swift编写的视图控制器?

创建一个完成块,在完成时不返回任何内容但执行另一个函数?

如何在一个函数中执行两个完成块并将完成块的数据传递给下一个视图控制器?

在PromiseKit中获取第一个响应对象,然后完成块

是否可以在 firestore 查询上有一个完成块?

按住并释放按钮代码将继续运行第一个动画完成块

如何编写一个采用int或float的C函数?

Swift - 如何在 for 循环中处理完成块?

如何在.childAdded firebase查询中添加完成块?

如何处理类之间的完成块的结果

如何避免使用__block和完成块的内存泄漏

如何防止Swift 3中的嵌套完成块?

如何使用搜索栏从 SwiftUI 视图调用完成块?

如何创建一个Objective-C桥接头?

迅速,等待两个完成块完成,然后返回列表

C#-如何用一个键和两个值编写一个集合(字典?)

如何编写一个不断读取一组行并标记行长度的C函数

如何从一个线程向另一个线程发送消息(用C语言编写)?