Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C“回调”_Ios_Objective C_Json_Object_Callback - Fatal编程技术网

Ios 目标C“回调”

Ios 目标C“回调”,ios,objective-c,json,object,callback,Ios,Objective C,Json,Object,Callback,我是Objective C的新手。现在我正在开发我的新应用程序,我对回调函数有一些问题 这就是我的设想: 我有一个名为Person的NSObject类,它显然代表一个人。 这个类有一些参数,如:人名、人名等。 在Person.m中,我有一个函数,它调用我的RESTAPI,检索我需要的所有数据,解析JSON响应,创建Person对象并将其插入NSMutableArray。 以下是我个人的一个例子。h: #import <Foundation/Foundation.h> @interf

我是Objective C的新手。现在我正在开发我的新应用程序,我对回调函数有一些问题

这就是我的设想:

我有一个名为Person的NSObject类,它显然代表一个人。 这个类有一些参数,如:人名、人名等。 在Person.m中,我有一个函数,它调用我的RESTAPI,检索我需要的所有数据,解析JSON响应,创建Person对象并将其插入NSMutableArray。 以下是我个人的一个例子。h:

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property(nonatomic, assign) id delegate;


@property NSString * name;
@property NSString * secondName;


-(void)getPersons;

@end
因此,其工作原理如下:

从ViewController.m调用Person.m中的getPersons函数 得到JSON响应后,我将对其进行解析,并使用Person对象创建数组 在ViewController.m中调用回调函数 所有这些都有效,因为我使用委托,但实际上,我不知道什么是委托。。。 我认为有一种替代的、更专业的方法来实施我的案例中的解决方案。
可能是块或类似的东西?

这是我通常做的。 关于人

+ (void)personsWithCompletion:(void (^)(NSArray *result, NSError *error))completion;
就你个人而言

+ (void)personsWithCompletion:(void (^)(NSArray *result, NSError *error))completion{

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:@"www.myApi.com/persons" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSMutableArray *allPersons = [[NSMutableArray alloc]init];
        // Parsing JSON response and getting array with all persons
        allPersons = [self parseaJson:responseObject];

//here you call the completion handler
if(completion) completion(allPersosn, error);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}
你可以从VC那里使用它

[Person personsWithCompletion:^(NSArray *result, NSError *error) {
        if (error == nil) {
            //do stuff
        }
    }];

希望能有所帮助。

要了解更多关于委派和协议的信息,您应该阅读以下内容:我不知道为什么有这么多人喜欢IOS中的委派。当然,有时你必须使用它,但当你为一个有10到数千行代码的应用程序编写代码时,委托会把你的代码库变成一场依赖性噩梦。当然,当Apple在其UIKit元素中设置了委托时,使用委托是很重要的,但是您根本不需要使用自己的定制委托。事实上,我已经用自定义委托零次编写了50k+行代码的应用程序。我想在这里发布一个答案来帮助你们,但堆栈中有太多爱委派的死脑筋的开发人员。。我很想投我的反对票,因为他们不知道如何正确地子类化,如何使用高级setter/getter和C块操作来避免使用委托。苹果自己的授权是有用的,但我说的是认真的,如果你从一个非常激烈的角度来编写IOS代码并坚持这种结构,你就不需要在这之外使用它:不要使用故事板,以编程方式创建所有视图,将您的代码封装到每个视图的角度控制器只保存单独视图的控制代码,所有视图代码都包含在单独的..子类文件中,例如,您有EXViewController.h和EXViewController.m,它们使用EXView.h和EXView.m,EXView使用EXButtonSubClass.h和EXButtonSubClass.m,EXView还使用EXCustomTextField.h和EXCustomTextField.m等,子类化到所有内容都在自己的范围内,同时使用自定义getter和setter传递值,这些getter和setter从视图控制器init方法向下传递到子视图,并从那里填充所有信息。委派是一种廉价的解决方法,但它也是一种非常不雅观的解决方案。委派只是一个对象,您可以调用它来提供数据或执行某些功能。它在数据/函数和使用它的代码之间提供隔离,这样它们就可以单独开发和维护,从而避免过度的相互依赖。这不是魔法。和任何编程概念一样,它可能被过度使用或使用不当。哇!你说得对,谢谢!这正是我想要的!这就像JavaScript中的承诺。
+ (void)personsWithCompletion:(void (^)(NSArray *result, NSError *error))completion;
+ (void)personsWithCompletion:(void (^)(NSArray *result, NSError *error))completion{

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:@"www.myApi.com/persons" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSMutableArray *allPersons = [[NSMutableArray alloc]init];
        // Parsing JSON response and getting array with all persons
        allPersons = [self parseaJson:responseObject];

//here you call the completion handler
if(completion) completion(allPersosn, error);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}
[Person personsWithCompletion:^(NSArray *result, NSError *error) {
        if (error == nil) {
            //do stuff
        }
    }];