IOS︰ 主线程在后台操作期间放慢

发布时间: 2016/9/4 0:40:04
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我用下面的代码来进行我想要一个背景同步但主线程是减缓或甚至没有进入停止时收到的 json 大于 20 个左右的记录。 有什么错误此代码为后台操作吗? 什么可以阻塞主线程。 谢谢你的任何建议。

请注意出 performSelectorOnMainThread 应用程序处理收到的 JSON,我改成另一个后台线程,但变化似乎不帮助下面的行是注释。

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1
#define kProductsURL [NSURL URLWithString: @"http://~/getproducts.php"]

//in viewDidLoad
if(hasInternet==YES && [loggedIntoServer isEqual:@1]) {

        dispatch_async(kBgQueue, ^{
            NSData* data = [NSData dataWithContentsOfURL: kProductsURL];
              //previous line grabed data from api.
            if (data) {
         //   [self performSelectorOnMainThread:@selector(fetchData:) withObject:data waitUntilDone:YES];//no longer doing this on main thread
                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                    [self fetchData:data];
                });

                }
        });
              ;
    } //close hasInternet, logged into server.



  - (void)fetchData:(NSData *)jsonFeed {
    NSError* error;
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:jsonFeed
                                                         options:kNilOptions
                                                           error:&error];
    NSMutableArray* latestProducts = [[NSMutableArray alloc] init];
    //this is specific to format of JSON
    if (![[json objectForKey:@“products"] isKindOfClass:[NSNull class]]) {
            latestProducts = [[json objectForKey:@“products"]mutableCopy];
    getProducts = latestProducts;
    int size = [latestProducts count];
    [self.tableView reloadData];
    getProducts = [self convertFeedtoObject:latestProducts];
    [self importAndSaveProducts:getProducts];//this imports and saves
    self.recentlySynced=YES;
     }
}

解决方法 1:

你只是做一些多余的东西。你派遣取一个后台线程中的数据。但接着你也做 [self.tableView reloadData]; 的后台线程中。这就是为什么你的 UI 将会受到影响。

试试这个︰

if(hasInternet==YES && [loggedIntoServer isEqual:@1]) 
{
    dispatch_async(kBgQueue, ^
    {
        NSData* data = [NSData dataWithContentsOfURL: kProductsURL];

        if (data) 
        {
              dispatch_async(dispatch_get_main_queue(), ^
              {
                  [self fetchData:data];
              });
        }
    });
}

我的所作所为是代码的我改变了这部分:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                    [self fetchData:data];
                });

因为你只应主线程中对 UI 做的任何更改。和这一部分我的代码做工作的主线程。

dispatch_async(dispatch_get_main_queue(), ^
                  {
                      [self fetchData:data];
                  });
官方微信
官方QQ群
31647020