菜鸟教程小白 发表于 2022-12-13 08:57:23

ios - 在Objective-C中是否可以在一组其他方法执行完毕后调用一个方法


                                            <p><p>这可能是一个幼稚的问题,但在我加载 ViewController 时,我正在使用一组方法(如下面的 getEachItem)加载应用程序所需的所有内容。这通常是 2 或 3 个项目,它们都被写入缓存。</p>
<p>我想调用在 getEachItem 的最终实例完成后运行的方法“showNavigation”,但不确定如何执行此操作。 getEachItem 使用 AFNetworking 执行 GET 请求。类似于 jQuery 完整 block 的东西,但对于以下 for 循环的全部内容。</p>
<pre><code>NSArray *tmpItems=;
for(NSDictionary *m in tmpItems){
// will also increment into the _menus array
];
];
}
;
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>当您调用 AFNetworking <code>GET</code> 方法时,它会返回一个 <code>AFHTTPRequestOperation</code>(一个 <code>NSOperation</code> 子类)。您可以利用这一事实为您的问题采用基于操作队列的解决方案。也就是说,您可以创建一个新的“完成操作”,这取决于特定 AFNetworking 操作的完成情况。</p>

<p>例如,您可以更改 <code>getEachItem</code> 方法以返回 <code>GET</code> 方法返回的 <code>AFHTTPRequestOperation</code>。例如,假设您有一个 <code>getEachItem</code> 当前定义如下:</p>

<pre><code>- (void)getEachItem:(id)identifier
{
   // do a lot of stuff

   ;
}
</code></pre>

<p>将其更改为:</p>

<pre><code>- (NSOperation *)getEachItem:(id)identifier
{
    // do a lot of stuff

    return ;
}
</code></pre>

<p>然后,您可以创建自己的完成操作,该操作将依赖于所有其他 <code>AFHTTPRequestOperation</code> 操作的完成。因此:</p>

<pre><code>NSOperation *completion = [NSBlockOperation blockOperationWithBlock:^{
    ;
}];

NSArray *tmpItems=;
for(NSDictionary *m in tmpItems){
    // will also increment into the _menus array
    NSOperation *operation = ];
    ;
    ];
}

[ addOperation:completion];
</code></pre>

<p>完成此操作后,在所有 <code>getEachItem</code> 操作完成之前,<code>completion</code> 操作将不会触发。请注意,当核心 <code>AFHTTPRequestOperation</code> 对象完成时,将触发此完成操作,但不能保证它们各自完成这些请求的 block 一定完成。</p>

<hr/>

<p>另一种方法是使用 GCD“组”。使用这种技术,您在提交每个请求时“进入”组,在 <code>GET</code> 方法的完成 block 中“离开”组。然后,您可以指定当群组通知您离开群组的次数与您进入群组的次数相同时要执行的代码块(即所有 AFNetworking 网络请求及其<code>成功</code>/<code>failure</code>block ,完成)。</p>

<p>例如,在 <code>getEachItem</code> 中添加一个 <code>dispatch_group_t</code> 参数:</p>

<pre><code>- (void)getEachItem:(id)identifier group:(dispatch_group_t)group
{
    dispatch_group_enter(group);

    // do a lot of stuff

    [self.manager GET:... parameters:... success:^(...) {
      // do you success stuff and when done, leave the group

      dispatch_group_leave(group);
    } failure:^(...) {
      // do you failure stuff and when done, leave the group

      dispatch_group_leave(group);
    }];
}
</code></pre>

<p>注意,您在提交请求之前“进入”组,<em></em><code>success</code> 和 <code>failure</code>block 都必须调用 <code>dispatch_group_leave </code>.</p>

<p>完成此操作后,您现在可以在请求循环中使用 <code>dispatch_group_t</code>,当组收到一切已完成的通知时执行 <code>showNavigation</code>:</p >

<pre><code>dispatch_group_t group = dispatch_group_create();

NSArray *tmpItems=;
for(NSDictionary *m in tmpItems){
    // will also increment into the _menus array
    group:group];
    ];
}

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    ;
});
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在Objective-C中是否可以在一组其他方法执行完毕后调用一个方法,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25465939/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25465939/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在Objective-C中是否可以在一组其他方法执行完毕后调用一个方法