菜鸟教程小白 发表于 2022-12-13 11:26:02

ios - objective-c "callback"


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

<p>所以这是我的场景:</p>

<p>我有一个名为 Person 的 NSObject 类,它(显然)代表一个人。
这个类有一些参数,比如:人名、人名等。
在 Person.m 中,我有一个函数可以调用我的 rest API,检索我需要的所有数据,解析 JSON 响应,创建 Person 对象并将其插入到 NSMutableArray。
这是我的 Person.h 的一个示例:</p>

<pre><code>#import &lt;Foundation/Foundation.h&gt;

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


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


-(void)getPersons;

@end
</code></pre>

<p>还有 Person.m 文件:</p>

<pre><code>#import &#34;Person.h&#34;
#import &lt;AFNetworking.h&gt;
#import &#34;ViewController.h&#34;

@implementation Person
@synthesize delegate;

// Call this function to get all persons
-(void)getPersons{

    AFHTTPRequestOperationManager *manager = ;
    [manager GET:@&#34;www.myApi.com/persons&#34; parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
      NSMutableArray *allPersons = [init];
      // Parsing JSON response and getting array with all persons
      allPersons = ;
      // Calling my &#34;callback&#34; function in my ViewController.m
      ;
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      NSLog(@&#34;Error: %@&#34;, error);
    }];
}

// This function will parse json response and create array with Person objects
-(NSMutableArray *)parseaJson:(NSDictionary *)jsonResponse{
    NSMutableArray *allPersons = [init];
    NSDictionary *resources = ;

    for (NSDictionary *jsonObject in resources) {
      Person *personObject = [init];
      personObject.name = ;
      personObject.secondName = ;

      ;
    }

    return allPersons;
}

@end
</code></pre>

<p>我也有我的 ViewController 类。从我的 ViewController 类中,我调用我的 Person 类以将所有 Person 对象放在一个数组中。
以下是 ViewController.h 的示例:</p>

<pre><code>#import &lt;UIKit/UIKit.h&gt;

@interface ViewController : UIViewController &lt;UITableViewDelegate, UITableViewDataSource&gt;{
    /**
   Array with all Person objects
   */
    NSMutableArray * personsArray;
}


/**
This function calls when Person.m have finished to retrive all persons from my API
*/
-(void)callback:(NSMutableArray *)recivedPersons;

@property (nonatomic, strong) IBOutlet UITableView *table;

@end
</code></pre>

<p>还有 ViewController.m :</p>

<pre><code>#import &#34;ViewController.h&#34;
#import &#34;Person.h&#34;

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    ;
    self.table.delegate = self;
    self.table.dataSource = self;


    // GETTING ALL PERSONS
    Person * myPersonClass = [init];
    ;
    myPersonClass.delegate = self; // This line is very important...
}

-(void)callback:(NSMutableArray *)recivedPersons{

    personsArray = [initWithArray:lineasBus];
    // Reloading my table
    ;

}
...
@end
</code></pre>

<p>所以,它的工作原理如下:</p>

<ol>
<li>从 ViewController.m 我在 Person.m 中调用我的 getPersons 函数</li>
<li>得到 JSON 响应后,我正在解析它并使用 Person 对象创建数组</li>
<li>在 ViewController.m 中调用“回调”函数</li>
</ol>

<p>所有这些都有效,因为我使用委托(delegate),但实际上,我不知道什么是委托(delegate)...
我认为有另一种更专业的方式来实现像我这样的解决方案。
(也许是 block 或类似的东西?)</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这是我通常做的。
关于 Person.h</p>

<pre><code>+ (void)personsWithCompletion:(void (^)(NSArray *result, NSError *error))completion;
</code></pre>

<p>在你的 Person.m 上</p>

<pre><code>+ (void)personsWithCompletion:(void (^)(NSArray *result, NSError *error))completion{

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

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

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      NSLog(@&#34;Error: %@&#34;, error);
    }];
}
</code></pre>

<p>你从 VC 中使用它</p>

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

<p>希望对你有帮助。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios -objective-c   &#34;callback&#34;,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/31904801/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/31904801/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - objective-c &#34;callback&#34;