IOS:后台操作期间主线程变慢

标签 ios multithreading

我正在使用以下代码来执行我想要的后台同步,但是当收到的 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;
     }
}

最佳答案

你只是做了一些多余的事情。您在后台线程中调度了数据提取。但随后您还在后台线程中执行了 [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];
                  });

关于IOS:后台操作期间主线程变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37253059/

相关文章:

iphone - UITableViewCell 动画

ios - 从地址簿中获取所有联系人的电话号码崩溃了吗?

c# - IsHandleCreated 和 InvokeRequired 的顺序

C++ 线程和变量

Java/Scala 线程池 : How to release a thread while waiting?

ios - UICollectionView 动画单元格大小更改会导致不良行为

ios - 当音频设备添加到 AVCaptureSession 时,UIImpactFeedbackGenerator 不工作

android - 如何在 iOS 中进行 match_parent

c++ - 多线程和类的全局实例?

c++ - 如何使一个线程 "promptly"中的内存存储在其他线程中可见?