应用冻结,疑似 UI 线程冲突



我的应用程序有时会冻结。只有 Admob 广告会像往常一样继续移动。因此,我们怀疑问题与广告和线程冲突有关。这是我实现横幅的代码:

    - (void)viewDidLoad{
    [super viewDidLoad];
    version = [[versionObj alloc]init];
    version = [[Resultados sharedResultados]version];
    alreadySawVideo = NO;
    manager = [[SecondViewManager alloc]init];

    dispatch_async(dispatch_get_main_queue(), ^{
        //[self showads];
        if(version.pro == 0) {
            //sets the size of tabla
            tabla.frame = CGRectMake(tabla.frame.origin.x, tabla.frame.origin.y, tabla.frame.size.width, tabla.frame.size.height-adHeight);
            admob *admobObj = [[admob alloc]init];
            admobBan = [admobObj showAdvertisement:[NSString stringWithFormat:@"secondViewBanner" ]];
            admobBan.rootViewController = self;
            [self.view addSubview:admobBan];
        }
    });

}

在另一个类的其他地方,该方法:

-(GADBannerView *)showAdvertisement: (NSString *)type{
    version = [[versionObj alloc]init];
    version = [[versionObjSingleton sharedversionObjSingleton] version];
        //organizes the link for planetary resources.
        CGRect screenRect = [[UIScreen mainScreen] bounds];
        //screen dimensions
        CGFloat viewHeight = screenRect.size.height;
        CGFloat viewWidth = screenRect.size.width;
        textViewHyperLink.frame = CGRectMake(0.0, viewHeight - GAD_SIZE_320x50.height-144, 160, 31);
        textViewHyperLink2.frame = CGRectMake(viewWidth/2, viewHeight - GAD_SIZE_320x50.height-144, GAD_SIZE_320x50.width-160, 31);;

        //organizes the link for the advertisement.
        screenRect = [[UIScreen mainScreen] bounds];
        if(![type caseInsensitiveCompare:@"pdfMap"]){
            admobBan = [[GADBannerView alloc] initWithFrame:CGRectMake(0,viewHeight-GAD_SIZE_320x50.height - tabBarHeight, GAD_SIZE_320x50.width, GAD_SIZE_320x50.height)];
        }else if(![type caseInsensitiveCompare:@"specificRutasList"]){
            admobBan = [[GADBannerView alloc] initWithFrame:CGRectMake(0,0, GAD_SIZE_320x50.width, GAD_SIZE_320x50.height)];
        }else{//std view.
            admobBan = [[GADBannerView alloc] initWithFrame:CGRectMake(0, viewHeight - GAD_SIZE_320x50.height - 113+65, GAD_SIZE_320x50.width, GAD_SIZE_320x50.height)];
        }
        if(![type caseInsensitiveCompare:@"mainMenu"]){
            admobBan.adUnitID = AdMod_ID_main;
        }else if(![type caseInsensitiveCompare:@"interactiveMap"]){
            admobBan.adUnitID = AdMob_ID_interactiveMap;
        }else if(![type caseInsensitiveCompare:@"mainRutas"]){
            admobBan.adUnitID = AdMob_ID_mainRutas;
        }else if(![type caseInsensitiveCompare:@"rutasMap"]){
            admobBan.adUnitID = AdMob_ID_rutasMap;        
        }else if(![type caseInsensitiveCompare:@"pdfMap"]){
            admobBan.adUnitID = AdMob_ID_pdfMap;
        }else if(![type caseInsensitiveCompare:@"realtimeMapBanner"]){
            admobBan.adUnitID = AdMob_ID_realtimeMap;
        }else if(![type caseInsensitiveCompare:@"secondViewBanner"]){
            admobBan.adUnitID = AdMob_ID_secondViewBanner;
        }else if(![type caseInsensitiveCompare:@"specificRutasList"]){
            admobBan.adUnitID = AdMob_ID_specificRutasList;
        }
        admobBan.rootViewController = self;
        GADRequest *request = [GADRequest request];
        request.gender = kGADGenderFemale;
        [request setBirthdayWithMonth:3 day:13 year:1991];
        //posicion de bogota:
        if (version.ciudad == 0) {
            [request setLocationWithLatitude:version.latitude
                                   longitude:version.longitude
                                    accuracy:1];
        }else if(version.ciudad == 1){// its medellin
            [request setLocationWithLatitude:version.latitude
                                   longitude:version.longitude
                                    accuracy:1];
        }else if(version.ciudad == 2){
            [request setLocationWithLatitude:version.latitude
                                   longitude:version.longitude
                                    accuracy:1];
        }
        [admobBan loadRequest:[GADRequest request]];
    return admobBan;
}

不能使用主队列,否则会冻结应用。使用此队列:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^(void) {
    if(version.pro == 0) {
        //sets the size of tabla
        tabla.frame = CGRectMake(tabla.frame.origin.x, tabla.frame.origin.y, tabla.frame.size.width, tabla.frame.size.height-adHeight);
        admob *admobObj = [[admob alloc]init];
        admobBan = [admobObj showAdvertisement:[NSString stringWithFormat:@"secondViewBanner" ]];
        admobBan.rootViewController = self;
        [self.view addSubview:admobBan];
    }
});

主队列仅用于更新视图,您也可以使用这个:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^(void) {
    if(version.pro == 0) {
        //sets the size of tabla
        tabla.frame = CGRectMake(tabla.frame.origin.x, tabla.frame.origin.y, tabla.frame.size.width, tabla.frame.size.height-adHeight);
        admob *admobObj = [[admob alloc]init];
        admobBan = [admobObj showAdvertisement:[NSString stringWithFormat:@"secondViewBanner" ]];

        dispatch_async(dispatch_get_main_queue(), ^{
            admobBan.rootViewController = self;
            [self.view addSubview:admobBan];
        });
    }
});

最新更新