0

做 iOS 有一段时间了,但现在我在一个复杂的客户端-服务器应用程序中工作,需要我:

  • 向服务器发送请求(使用 AFHttpRequestOperation) 响应是间隔或字典

  • 如果我得到一个间隔,我需要等待(间隔)秒并再次调用服务器(等待/睡眠?)

  • 这种情况一直持续到我收到一条过期消息、用户取消或收到字典(如上所述)。

  • 如果收到字典,我必须暂停对服务器的调用,直到用户对我显示给他的信息采取行动。

  • 根据用户的决定,我需要恢复并继续呼叫、等待、呼叫等等,直到我收到字典或它过期(如果用户拒绝信息)或者如果用户接受,停止询问并进一步处理信息(但我不会一直叫发球)

作为 iOS 线程的新手,最好的方法是什么:?我一直在使用 dispatch_asynch + performSelector:onThread:withObject 但它给了我各种各样的问题!

问题是:在内部使用 AFHttpRequestOperation 的 NSOperation 子类中实现暂停、取消、等待/睡眠的最佳方法/方法是什么?

我是线程方面的菜鸟,特别是在 iOS 下,非常感谢您的帮助!!!!

4

1 回答 1

1

    我建议不要在网络中使用线程。虽然看起来还不够清楚,但实现异步网络请求所需的 CPU 时间要少得多。
  许多人尝试这样做并最终导致异步网络调用的委托方法未被调用。如果在后台线程上执行网络调用,则线程可能会在委托完成调用之前退出。
  只需调用取消/暂停方法即可取消异步调用。
  如果你觉得主线程很慢,请确保避免对其进行繁重的操作,例如解析,调用CameraView。
  我使用 NSrunLoop 只是为了测试如何做到这一点,没有太多优势
 

 -(void)start
{
  [self willChangeValueForKey:@"isExecuting"];
  _isExecuting = YES;
  [self didChangeValueForKey:@"isExecuting"];
  NSURL* url = [[NSURL alloc] initWithString:@"http:your url"];
  NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
  connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; // ivar
  [request release];
  [url release];

 // Via the run loop 
  NSPort* port = [NSPort port];
  NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 
  [runLoop addPort:port forMode:NSDefaultRunLoopMode];
  [connection scheduleInRunLoop: runLoop forMode:NSDefaultRunLoopMode];
  [connection start];
  [runLoop run];
}

您可以将本机 api 替换为您的库中的。希望这在某种程度上有所帮助。

于 2014-05-30T16:49:02.937 回答