2012-06-21 23 views
5

Tôi đã viết một Lớp Singleton để quản lý iAds.The iAds bật lên sau 5 giây không hoạt động của người dùng. Cuộc gọi số idleTimerExceeded tạo thông báo để hiển thị iAd. Mã này hoạt động tốt cho các yêu cầu của tôi nhưng kể từ khi tôi mới phát triển iOS, ứng dụng của tôi đôi khi bị treo bất ngờ sau khi tích hợp mã này. Mã này dẫn đến rất nhiều cảnh báo, vv Tôi muốn tối ưu hóa mã của tôi về bộ nhớ và hiệu suất.Lớp Singleton để hiển thị iAds cho iPhone

Tôi rất biết ơn các đề xuất và đánh giá tốt của bạn.

Dưới đây là mã của tôi:

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

Tôi đang phát triển trong iOS 5 và sử dụng xcode 4.2. – muneikh

+0

Khi singleton iAd được tạo, nó sẽ tiếp tục hoạt động trong suốt thời gian còn lại của ứng dụng của bạn? Hay bạn phát hành nó và tạo lại nó sau này? – Malcolm

+0

Có, tôi đang cố gắng có một phiên bản iAd cho ứng dụng. – muneikh

Trả lời

3

Đây là những gì bạn cần. Mã này là chủ đề an toàn cũng như sẽ không có bất kỳ vấn đề bộ nhớ và cảnh báo nào.

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

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

    return __sharedInstance; 
} 
+0

Cảm ơn, một câu hỏi nhanh. Cách tiếp cận tốt nhất để quản lý iAds trong ứng dụng Tab Bar là gì? – muneikh

+0

Trong ý nghĩa nào bạn đang tiếp cận để quản lý? – Kuldeep

+2

Vì sau khi tích hợp iAds, tôi nhận thấy rằng hiệu suất ứng dụng của tôi đã bị chậm lại một chút và phải mất một chút thời gian chuyển đổi giữa các tab. – muneikh

Các vấn đề liên quan