IOS:主线程在后台操作期间减慢速度

时间:2016-05-16 11:39:32

标签: ios multithreading

我正在使用以下代码来执行我想要的后台同步,但是当收到的json大于20个左右的记录时,主线程正在减速甚至停止。此代码的后台操作有什么问题吗?什么可以阻止主线程。感谢您的任何建议。

请注意,performSelectorOnMainThread下面有一个注释掉的行,其中应用程序处理收到的JSON,我更改为另一个后台线程,但更改似乎没有帮助。

x \ "param" foreach {n => println(n \ "@name" + " -> " + n \ "@value")}

3 个答案:

答案 0 :(得分:1)

您不需要对同一队列进行嵌套调用。您还应该在主线程上执行任何UI工作。有关更多信息,请查看Apple的Concurrency Programming Guide

在你的fetchData方法中加载你的表格。

warr

答案 1 :(得分:1)

你刚做了多余的事情。您在后台线程中调度了数据的提取。但是后来你也在后台线程中做了date: new Date(moment(json.data.date).format('yyyy-MM-dd'))。这就是您的用户界面受到影响的原因。

试试这个:

Invalid date

我做的是改变了你的代码部分:

[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];
              });
        }
    });
}

答案 2 :(得分:1)

原始代码中有多处错误,请更改为以下内容:

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) //CHANGE TO BACKGROUND
#define kProductsURL [NSURL URLWithString: @"http://~/getproducts.php"]

//in viewDidLoad
if(hasInternet==YES && [loggedIntoServer isEqual:@1]) {
        dispatch_async(kBgQueue, ^{
            NSData* data = [NSData dataWithContentsOfURL: kProductsURL];
            if (data) {             
                [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];

        //Do this on the main thread:
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });

        getProducts = [self convertFeedtoObject:latestProducts];
        [self importAndSaveProducts:getProducts];//this imports and saves
        self.recentlySynced=YES;
     }
}

根据表视图的工作方式和数据源的含义,您可能希望将重新加载表视图行(主队列调度)移到self.recentSynced = YES下面。