1

希望你们能帮助我:)NSOperation在解析数据时绘制用户界面?

在主线程中,我创建一个NSOperation并将其添加到队列中。 该操作所做的是使用NSURLConnection连接到数据服务器,保存receivedData并解析它。

Operation.m

- (void)start 
{ 
    NSLog(@"opeartion for <%@> started.", [cmd description]); 

    [self willChangeValueForKey:@"isExecuting"]; 
    _isExecuting = YES; 
    [self didChangeValueForKey:@"isExecuting"]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:_url]; 

    [request setHTTPMethod:@"POST"]; 
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", m_BOUNDARY] forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:_postData]; 

    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (_connection == nil) 
     [self finish]; 
} 

然后在此NSURL委托方法我分析我刚刚从服务器接收到的数据。

Operation.m

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    [self parseItems]; 
} 

在数据上,我可以找到喜欢的物品,例如,screenItem,CellItem,TextItem我发送给主线程绘制他们同时到达。 (我创建一个UITableView如果itemTable到达,或创建一个UIWebView如果itemWeb到达)

使用该发送项目主线:

Operation.m

- (void) parseItems 
{ 
    while ([_data length] > 0) 
    { 
     NSInteger type = [self _readByte]; 

     switch (type) 
     { 
      case SCREEN: 
      { 
       [self _send: [self _readScreen]]; 
       break; 
      } 
      case CELL: 
      { 
       [self _send: [self _readCell]]; 
       break; 
      } 

      // ... A lot of different items 
     } 
    } 
} 

- (void)_send:(CItem*)_item 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"newItem" object:_item]; 
} 

然后在通知接收器:

AppDelegate.m

- (void) _newItemArrived:(NSNotification *) notification 
{ 
    [self performSelectorOnMainThread:@selector(processItem:) withObject:[notification object] waitUntilDone:NO]; 
} 

我的问题是,直到NSOperation完成后才会绘制UI。我认为NSOpertion,作为一个不同的线程,不会阻止主线程,但相信这是发生了什么。

这个问题的一些提示?

非常感谢您的阅读!

+0

我刚刚回答了一个相关问题:http://stackoverflow.com/questions/11158294/nsoperation-mainqueue-issue/13477136#13477136。希望这可以帮助。 – 2012-11-20 16:21:09

回答

0

你使用的是NSOperationQueue

检查出this answer的问题NSOperation blocks UI painting?关于如何使用来自在另一个线程上异步运行的NSOperation的通知来更新UI的简单示例。

UPDATE

  1. NSURLConnection的支持本身带有一个委托的异步连接。你应该使用这个。如果你有特定的问题,你应该描述这些问题。
  2. 查看ASIHTTPRequest库。
  3. 如果你真的想要使用这种方法,你可以尝试同步运行NSURLConnection(使用类方法sendSynchronousRequest:returningResponse:error:)。由于连接在后台线程上,您的应用将保持响应。但是,在收到所有数据之前,您将无法更新任何内容。
+0

感谢您的回答! 是的,我使用NSOperationQueue。我已经读过这个答案,并且正在做什么,但没有奏效。我必须错过一些东西,而我无法看到它。 :S – jota 2010-01-22 11:32:15

+0

为什么要强制Operation的启动方法在主线程上运行? – gerry3 2010-01-22 11:52:22

+0

此外,您使用NSURLConnection的方式是用于异步下载,您不需要单独的线程。你只需要实现委托方法。 – gerry3 2010-01-22 11:58:10

0

所以我知道这是一个很老的问题,但我遇到同样的问题,并通过文件和博客去个小时后,我发现这个职位从维姆Haanstra http://www.depl0y.com/?p=345

一个很好的解决方案把你的NSOperation在一个无限循环中,直到你获得数据回来应该做的伎俩!