等待对象可用

乔纳斯·施密德(Jonas Schmid)

我相信我的用例相当普遍,但是我找不到任何可以使我100%确定自己在做什么的文档。任何指针表示赞赏。

在我的应用程序中的某个时刻,我开始下载对象。之后,用户可以单击一个按钮。如果对象已完成下载,我想执行一些代码。否则,我要等到对象下载完毕并执行相同的代码。如果用户未单击该按钮,则我什么也不想做。下载的对象丢失。

我的基本想法是执行以下操作:

NSObject *myObj = nil;

- (void)download {
  [self downloadObj:^(NSObject *obj){
    myObj = obj;
  }];
}

- (void)buttonClicked {
  waitOrExecuteDirectly:^{
    // Some code with myObj
  }
}

当然,第一个问题是“我如何等待?”

所以我尝试了

- (void)buttonClicked {
  if(myObj) {
    // Some code
  } else {
    // Wait then do the exact same code
  }
}

但是我认为棘手的问题是“如果在计算“ if”之后并且在输入“ else”块之前对象完成下载,会发生什么?”。

我试图将下载文件封装在中NSOperation并使用该completionBlock属性。但是,如果在设置回调时该操作已经完成,则永不调用completionBlock。我不想在“下载”方法中设置回调,因为用户可能不会单击按钮。

是否有内置机制允许我根据任务状态为将等待或直接执行的任务提供完成回调?如果没有,那么由我自己做的最佳实践是什么?NSLock设置和阅读时使用myObj

塔玛斯·扎霍拉(TamásZahola)

我认为您不应该在主线程上等待,因为那样会阻塞整个用户界面。我的方法是这样的:

typedef MyOperation void (^)(NSData * myData);

...

@private MyOperation _operationWhenDownloadFinished; // instance variable
@private NSData * _data

...

-(void)buttonPressed{
   [self waitAndPerformOperation:^(NSData * myData){ ... }];
}

-(void)waitAndPerformOperation:(MyOperation)operation{
   if(_data != nil){
       operation(myData);
      _operationWhenDownloadFinished = nil;
   }else{
      _operationWhenDownloadFinished = operation;
   }
}

...

-(void)downloadFinished:(NSData*)downloadedData{ // this is called on the main thread, e.g. by an NSURLConnection delegate
   _data = downloadedData;
   if(_operationWhenDownloadFinished != nil){
      [self waitAndPerformOperation:_operationWhenDownloadFinished];
   }
}

由于按下按钮和downloadFinished委托回调都发生在主线程上,因此我们可以毫不费力地避免任何竞争情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在调用回调之前等待异步创建的对象完全可用?

来自分类Dev

等待创建对象

来自分类Dev

SQL Server不可用时,异步/等待未等待

来自分类Dev

强制硒暂停并等待字段可用

来自分类Dev

ThreadPool等待Unti线程在池中可用(限制)

来自分类Dev

等待对象被初始化

来自分类Dev

等待直到收到用户对象

来自分类Dev

等待对象初始化

来自分类Dev

等待直到收到用户对象

来自分类Dev

查看ActiveX对象的可用方法

来自分类Dev

System.gc()的可用对象

来自分类Dev

如何从对象创建可用数组

来自分类Dev

如何使此代码等待线程池中的线程可用?

来自分类Dev

如何使Angular指令等待隔离范围数据可用?

来自分类Dev

Visual Studio Team Services-等待可用的代理

来自分类Dev

使用SignalR等待ASP.NET中的可用套接字

来自分类Dev

数据库超时,等待可用的免费连接

来自分类Dev

Vue:如何避免在mount()中使用setTimeout等待道具可用?

来自分类Dev

如何等待数据可用-扑朔迷离

来自分类Dev

重复-存储位置不可用,正在等待Google

来自分类Dev

如何使此代码等待线程池中的线程可用?

来自分类Dev

发布者应等待经纪人可用

来自分类Dev

Dart:等待函数调用未等待并返回Future对象

来自分类Dev

SAPUI5等待延迟的对象//等待.done()函数

来自分类Dev

如何轮询可用的TTS引擎以获取可用的语言而无需实例化每种语言并等待init

来自分类Dev

量角器等待多个对象

来自分类Dev

不等待模拟对象的异步回调

来自分类Dev

返回对象的方法可以等待任务

来自分类Dev

Java的等待与共享整数对象通知