2016-06-16 147 views
1

我想问一下在Swift中协议和委托模式是如何工作的。Swift:关于协议和委托模式

我有一个应用程序,让我试试在iOS平台上的谷歌广告SDK。但是我错过了一些东西,并且对这些方法的工作方式感到困惑。

我有这样的代码;

import UIKit 
import GoogleMobileAds 

class ViewController: UIViewController, GADInterstitialDelegate { 

@IBOutlet weak var bannerView: GADBannerView! 
let request = GADRequest() 
var interstitial: GADInterstitial! 

@IBOutlet weak var mylbl: UILabel! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    bannerView.adUnitID = "xxx" 
    bannerView.rootViewController = self 
    bannerView.loadRequest(self.request) 
    interstitial = createAndLoadInterstitial() 
} 

func createAndLoadInterstitial() -> GADInterstitial { 
    let interstitial = GADInterstitial(adUnitID: "xxx") 
    interstitial.delegate = self 
    interstitial.loadRequest(self.request) 
    return interstitial 
} 

func interstitialDidDismissScreen(ad: GADInterstitial!) { 
    interstitial = createAndLoadInterstitial() 
    mylbl.text = "No ad" 

} 

func interstitialDidReceiveAd(ad: GADInterstitial!) { 
    mylbl.text = "received ad" 
} 

@IBAction func touched(sender: AnyObject) { 

    if interstitial.isReady 
    { 
     interstitial.presentFromRootViewController(self) 
    } 
    else 
    { 
     mylbl.text = "Not Ready!" 
    } 
} 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

对于上面的代码中,我意识到的方法和属性的协议蓝图采用类或结构或枚举。协议中定义的方法或属性应该在相关代表采用的类上实现。

我想问一下,cofused point:OK从代理“GADInsterstitialDelegate”继承的名为“interstitialDidDismissScreen”的方法,但是如何通过按插页式广告的关闭按钮处理该方法。谷歌的工程师们在哪里实施,他们如何成功实现这一行为。谢谢你的帮助。

良好的黑客,

回答

1

按钮处理发生在GADInterstitial类中。当他们设置课程时,他们可能有一些内部方法可以处理所有的广告交互,然后使用委托方法,他们会将您需要知道的信息发回给班级,以保持您的用户界面的管理。通过实现委托及其方法,你说我想使用你的类所做的事情,然后我也想处理来自该类的所有反馈。如果你要创建自己的班级并实施一个协议和委托,你可以在班级内做任何你想做的事情,然后只传递一小段信息给班级的委托人。一个例子是一个条形码阅读课程。我不在乎条形码是如何读取的,我只是想知道代码,所以我可以将我的调用类设置为条形码阅读类的代表,并且当条形码被读取时,我会收到条形码一个条形码委托方法。

+0

OMG!这个答案更加明智,开放和可信。你的条形码例子非常好。感谢您宝贵的答复!我完全理解,我错过了什么,什么是重点!我认为这个想法保持了我们的对象或类别抽象。我认为抽象的好模式。那么确切的说,AdMob SDK的代码是封闭的吗?我们看不到班上有什么。它只是给我们一个端点并使用输出。完善。非常感谢你。 –

1

你的问题的措辞是乱码,很难弄清楚。

协议基本上是一个合同。它表示符合协议的objets承诺提供属性,并对协议定义的方法作出响应。

当你说

someObject.delegate = self 

你是一个指针传递给自己的其他对象。这就像给别人打你的电话号码,并说“请为我跑这些差事,如果你有任何问题,请给我打这个电话号码,也可以在差事完成时给我打电话。”

由于其他对象知道它的委托符合特定的协议,它知道什么样的信息可以通过手机发送(什么样的信息可以发送给代表)

我怀疑方法interstitialDidReceiveAd(ad: GADInterstitial!)interstitialDidDismissScreen(ad: GADInterstitial!)是委托方法。

interstitial对象需要发送消息给它的委托时,它调用这些方法。

+0

感谢您的回答。你是对的,我对你的答案感到满意。当我浏览Interstitial对象时,一些注释行确认了这个想法; “///如果插页式广告已准备好显示,则返回YES。此属性从NO切换为YES后,将调用代理的 /// interstitialAdDidReceiveAd:”。 –

+1

没错。委托设计模式在Cocoa中使用,在Mac和iOS上都用于Objective-C和Swift。我一直在使用它10多年,所以我100%肯定我说的是真实的。 –

+0

哇什么体验:+10年。感谢您的评论:) –