ios - 未召集委托(delegate)

标签 ios swift delegates alamofire

我有一个自定义委托(delegate)/协议(protocol)设置。我使用 alamofire 发出 get 请求,然后解析 json。 json 被排列成 Swift 对象,并传递回 Collection View Controller 。除了派他们回去的委托(delegate)永远不会被召唤。不过其他一切都很完美。这是我的相关代码:

class ViewController: UICollectionViewController, MainCatGallery {

var cats = [Cats]()
let theManager = ImgurAPIManager()

override func viewDidLoad() {
    super.viewDidLoad()
    loadCats()
    theManager.delegate = self

}

  func gotCatsArray(x: [Cats]) {
      self.cats = x
      self.collectionView?.reloadData()
  }
}

和:

  protocol MainCatGallery {
func gotCatsArray(x: [Cats])
}


class ImgurAPIManager: NSObject {

static let sharedInstance = ImgurAPIManager()
let jsonClass = ParseJson()
var delegate:MainCatGallery?
var catGallery = [Cats]()

func getGallery() {
    Alamofire.request(Router.Get)
    .response { (request, response, data, error) -> Void in
        do {
            let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
            self.catGallery = self.jsonClass.parseCatGalleryJson(jsonDict)
            for x in self.catGallery {
                print(x.url!)
            }
            self.delegate?.gotCatsArray(self.catGallery)

        }
        catch {

         }
      }

   }

}

所有这些都工作得很好——getGallery() 函数中的 print 语句按预期打印出每个 URL。当它调用委托(delegate)时,它永远不会将对象传递回 View Controller 。并且设置断点表明它永远不会将数据传回。

我之前在其他项目中的委托(delegate)/协议(protocol)中使用过完全相同的模式,并且从未遇到过问题。知道为什么它没有被调用吗?

最佳答案

在您的 ImgurAPIManager 类中,您有一个共享实例,您可以使用它来设置委托(delegate)。

static let sharedInstance = ImgurAPIManager()

但是,在 ViewController 中,您创建了一个新实例并设置了委托(delegate):

let theManager = ImgurAPIManager()

override func viewDidLoad() {
    super.viewDidLoad()
    theManager.delegate = self
}

更改此行:

theManager.delegate = self

对此:

ImgurAPIManager.sharedInstance.delegate = self

Roman Sausarnes指出如下:

为了避免将来发生这种混淆,您可以标记您的 ImgurAPIManager 初始化程序 private: private init() { }。这样您就不会意外地从文件外部创建它的实例。 –

关于ios - 未召集委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34934809/

相关文章:

ios - 当我触摸 AlertView 上的按钮时如何将光标设置为文本字段

ios - 无法将 Cordova/Ionic App 的二进制文件提交到 Appstore

swift - Alamofire 表单编码的 POST 请求因 responseSerializationFailed 而失败

lambda - 试图了解Kotlin示例

ios - 从另一个 viewController 快速检测 - iOS swift

ios - 在 iOS 中出现键盘时启用滚动内容

ios - "imagePickerController: didFinishPickingMediaWithInfo:"的问题

ios - Swift 中具有/不同单元格类型的可重用数据源

xcode - Swift:类型 (_)-> 的值没有成员 'Generator'

c# - .NET 单一委托(delegate)与多播委托(delegate)