【问题标题】:how do i wait for a task inside a method before continuing execution如何在继续执行之前等待方法内的任务
【发布时间】:2016-02-18 06:48:54
【问题描述】:

我有一个类(假设名为“A”),其中包含一个带有NSURLSessionDataTask 的方法和一个NSDictionary 属性。我将 JSON 响应添加到 NSDictionary 属性。在我的 mainViewController 中,我创建了一个 A 类对象并调用了该方法。现在在mainViewController 中,我需要访问A 类的NSDictionary。现在的问题是在调用A 类中的方法之后,我需要在访问NSDictionary 之前添加[NSThread sleepForTimeInterval:5.0]; 或者字典是无效的。我在访问字典之前尝试过这个,但它没有用

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
    [requestObject requestAPIMethod];
});

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// access the dictionary

任何帮助将不胜感激,谢谢。

P.S : 我在 SO 上遇到过类似的问题,但没有找到任何线索。

【问题讨论】:

  • 您应该将完成处理程序块传递给类 A 中的方法。检索到响应后,使用返回的数据调用完成处理程序。
  • 从不在主线程中休眠。 从不。
  • @Avi 我知道 avi,只是想确保代码运行,然后再调查一下。还是谢谢你。
  • @Paulw11 - 谢谢你的提示,我已经写了答案,如果我错过了什么,请告诉我。

标签: ios objective-c grand-central-dispatch semaphore dispatch-async


【解决方案1】:

在花了几个小时试图弄清楚事情之后,我会回答我自己的问题,以便像我这样的新手可以受益。就像 Paulw11 提到的那样,我使用了一个完成处理程序块并将完成处理程序块声明为 A 类的 .h 文件:

typedef void(^myCompletion)(BOOL);

然后我将块作为参数传递给方法:

- (void) requestAPIMethod : (myCompletion) compBlock;

然后在你的方法的定义中确保你这样做:

compBlock(YES);

这必须在您需要做的所有处理之后完成。 然后在我的 mainViewController.m 中,我创建了一个 A 类的对象,然后所有等待的代码都进入了:

[classAObject classAMethod:^(BOOL isSuccess) {
if(isSuccess) {
// code that was waiting for the method to complete execution
    }
}];

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2020-02-01
    • 1970-01-01
    • 2011-03-19
    • 2012-03-06
    • 2021-11-19
    相关资源
    最近更新 更多