【问题标题】:How can you return objects from methods that use blocks to retrieve data? [duplicate]如何从使用块检索数据的方法中返回对象? [复制]
【发布时间】:2016-02-22 23:15:16
【问题描述】:

我已经离开 iOS 和编程很长时间了,然后又重新开始使用它,我不知道如何最好地处理将数据返回到另一个类的方法中的块。

我创建了一种从 Internet 下载一些数据的方法。

-(NSArray*) getDataFromWeb
{
    DataSync * dataS = [[DataSync alloc] init];

    [dataS downloadData:@"Full"
                              successBlock:^(NSArray *dataArray)
     {
         NSLog(@"Data : %@", dataArray);
         myDataArray = [dataArray copy];
     }
                                errorBlock:^(NSError *error)
     {
         NSLog(@"ERROR: %@",error);
     }];


return myDataArray;
}

在过去,我通常会有一个 return 语句返回数组。但是由于该块已关闭在另一个线程上获取数据,因此返回将过早触发,并且不会检索到数据,而我只是得到一个(null)返回。

在块完成工作并用数据填充数组后,将数据传回另一个调用此方法的类的推荐方法是什么?我可以在块的每个成功或错误部分有两个返回状态吗?

【问题讨论】:

  • 嗨,马特,这是一个快速的问题。谢谢-代码
  • 没关系;答案仍然正确并直接适用于您的问题。您需要从完成块中调用您的更新代码。

标签: ios objective-c


【解决方案1】:

有两种选择。

没有。 1,我不建议这样做,是等待块完成并返回值。就像我说的,除非你真的知道自己在做什么,否则你应该避免这种情况,因此,我不会详细介绍它的实现。

没有。 2是不返回值,而是用完成块来处理它。基本上,你让你的函数返回 void,并添加一个带有对象参数的块参数。调用这个方法看起来很像调用downloadData

假设你的方法现在看起来像这样-(void)getDataFromWebWithCompletion:(CompletionBlock)block,在downloadData的块的末尾,你会做这样的事情:

if(block){
  block(dataArray)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2019-10-13
    • 2014-04-11
    相关资源
    最近更新 更多