2012-06-21 8 views
5

Napisałem klasę Singleton do zarządzania reklamami. Reklamy iAds pojawiają się po 5 sekundach braku aktywności użytkownika. Wywołanie idleTimerExceeded powoduje wygenerowanie powiadomienia o wyświetleniu reklamy iAd. Ten kod działa dobrze dla moich wymagań, ale ponieważ jestem nowy w rozwoju iOS, moja aplikacja czasami zawiesza się nieoczekiwanie po zintegrowaniu tego kodu. Ten kod powoduje wiele ostrzeżeń itp. Chciałbym zoptymalizować mój kod pod względem pamięci i wydajności.Klasa Singleton do wyświetlania reklam iAds dla iPhone'a

Byłbym bardzo wdzięczny za życzliwe sugestie i recenzje.

Poniżej jest mój kod:

iAdSingleton.h

#import <Foundation/Foundation.h> 
#import "AppDelegate.h" 
#import "iAd/iAd.h" 

@interface iAdSingleton : UIViewController<ADBannerViewDelegate> { 
    ADBannerView *adView; 
    UIViewController *displayVC; 
    NSTimer *idleTimer; 
    BOOL isItFirstTime; 
} 
@property (nonatomic, retain) ADBannerView *adView; 
@property (nonatomic, retain) UIViewController *displayVC; 
@property (nonatomic) BOOL isItFirstTime; 

+ (id) shareAdSingleton; 
- (void) resetIdleTimer; 
- (void) idleTimerExceeded; 

@end 

iAdSingleton.m

#import "iAdSingleton.h" 

@implementation iAdSingleton 

static iAdSingleton* _sharedAdSingleton = nil; 

BOOL bannerVisible = NO; 
BOOL controlAccessBannerVisibility = NO; 
@synthesize adView, displayVC; 
@synthesize isItFirstTime; 

#define kMaxIdleTimeSeconds 5.0 

+(id)sharedAdSingleton 
{ 
    @synchronized(self) 
    { 
     if(!_sharedAdSingleton) 
      _sharedAdSingleton = [[self alloc] init]; 
     return _sharedAdSingleton; 
    } 
    return nil; 
} 

+(id)alloc 
{ 
    @synchronized([iAdSingleton class]) 
    { 
     NSAssert(_sharedAdSingleton == nil, @"Attempted to allocate a second instance of a singleton."); 
     _sharedAdSingleton = [super alloc]; 
     return _sharedAdSingleton; 
    } 

    return nil; 
} 

-(id)init 
{ 
    self = [super init]; 
    if (self != nil) { 

    /*     Initialize The Parameters Over Here     */ 

     //adView = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 480, 0, 0)]; 
     adView = [[ADBannerView alloc] init]; 
     adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait; 
     self.adView.delegate=self; 
     [self resetIdleTimer]; 
    } 
    return self; 
} 

-(void)dealloc 
{ 
    displayVC = nil; 
    if (adView) { 
     [adView removeFromSuperview]; //Remove ad view from superview 
     [adView setDelegate:nil]; 
     adView = nil; 
    } 
    [super dealloc]; 
} 

-(UIViewController *)viewControllerForPresentingModalView 
{ 
    return displayVC; 
} 

- (void)bannerViewDidLoadAd:(ADBannerView *)banner 
{ 
    banner.hidden = NO; 
    if(!bannerVisible){ 
     NSLog(@"Banner Changes 1 - Purpose: Visibility"); 
     // [UIView beginAnimations:@"bannerAppear" context:NULL]; 
     // banner.frame = CGRectOffset(banner.frame, 0, -100); 
     // [UIView commitAnimations]; 
     bannerVisible = YES; 
     controlAccessBannerVisibility = YES; 

    } 
} 

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error 
{ 
    //NSLog(@"Unable to receive Ad."); 
    NSLog(@"Banner Changes 2 - Purpose: Unable to Receive Ad."); 
    banner.hidden = YES; 
    if(bannerVisible){ 
     [UIView beginAnimations:@"bannerDisappear" context:NULL]; 
     banner.frame = CGRectOffset(banner.frame, 0, 100); 
     [UIView commitAnimations]; 
     bannerVisible = NO; 
    } 
} 

- (BOOL) bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave 
{ 
    NSLog(@"Pause anything necessary"); 
    return YES; 
} 

- (void) bannerViewActionDidFinish:(ADBannerView *)banner 
{ 
    NSLog(@"We now resume to normal operations"); 
} 

- (void)resetIdleTimer { 

    if (!idleTimer) { 
     idleTimer = [[NSTimer scheduledTimerWithTimeInterval:kMaxIdleTimeSeconds 
                 target:self 
                selector:@selector(idleTimerExceeded) 
                userInfo:nil 
                repeats:NO] retain]; 
    } 
    else { 
     if (fabs([idleTimer.fireDate timeIntervalSinceNow]) < kMaxIdleTimeSeconds-1.0) { 
      [idleTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:kMaxIdleTimeSeconds]]; 
      /* 
      Notification: HideAd 
      */ 

      NSLog(@"Notification Generated For HideAd"); 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"HideAdBanner" object:nil userInfo:nil]; 

     } 
    } 
} 

- (void)idleTimerExceeded { 

    AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    if (appDel.adVisible == NO) { 
     NSLog(@"Notification Generated For ShowAd"); 

     /* 
     Notification: ShowAd 
     */ 

     if (controlAccessBannerVisibility == YES) { 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"ShowAdBanner" object:nil userInfo:nil]; 
     } 
    } 
} 

@end 
+0

Rozwijam się w iOS 5 i korzystam z xcode 4.2. – muneikh

+0

Po utworzeniu singletu iAd trwa on przez resztę życia aplikacji? Czy możesz go zwolnić i utworzyć ponownie później? – Malcolm

+0

Tak, staram się mieć jedną instancję iAd dla życia aplikacji. – muneikh

Odpowiedz

3

To jest to, czego potrzebujesz. Ten kod jest bezpieczny dla wątków, jak również nie ma problemu z pamięcią i ostrzeżeń.

+ (iAdSingleton *) sharedInstance 
{ 
    static dispatch_once_t onceToken; 
    static iAdSingleton * __sharedInstance = nil; 

    dispatch_once(&onceToken, ^{ 
     __sharedInstance = [[self alloc] init]; 
    }); 

    return __sharedInstance; 
} 
+0

Dzięki, jedno szybkie pytanie. Jakie jest najlepsze podejście do zarządzania iAds w aplikacji paska kart? – muneikh

+0

W jakim sensie masz zamiar zarządzać? – Kuldeep

+2

Odkąd, po integracji z iAds, doświadczyłem, że moja wydajność aplikacji została nieco zwolniona i zajmuje trochę czasu przełączanie między kartami. – muneikh

Powiązane problemy