Swift读取Wordpress api的Json数据

import UIKit

class WPJSONParser: NSObject {

//MARK: Variables
private var page : Int
private var categoryPage: Int
private var urlSite : String
private var categoryID: String!
var categoryDic : NSDictionary? = nil
let queryQ : dispatch_queue_t

//MARK: Function

//Init required because of singleton
required init(url:NSString) {
    urlSite = url
    page = 1
    categoryPage = 1
    queryQ = dispatch_queue_create("QueryQ", DISPATCH_QUEUE_SERIAL)
    super.init()
    self.getCategory { (response) -> () in
        self.categoryDic = response
    }
}

//Singleton pattern
class func sharedInstance(url:NSString)->WPJSONParser {
    struct Static {
        static var instance : WPJSONParser? = nil
        static var onceToken : dispatch_once_t = 0
    }

    dispatch_once(&Static.onceToken) {
        Static.instance = self(url: url)
    }
    return Static.instance!
}

func getRecentPost(recentPost:(post:[AnyObject])->()) {
    var url : NSURL = NSURL(string: "http://\(urlSite)/api/get_recent_posts/?count=20")!
    dispatch_async(queryQ, {
        var data : NSData? = NSData(contentsOfURL: url)
        if data != nil {
            var responseJson: AnyObject! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil)
            if responseJson != nil {
                var response : [AnyObject] = responseJson.objectForKey("posts") as [AnyObject]
                dispatch_async(dispatch_get_main_queue(), {
                    recentPost(post:response)
                })

            }
        }
    })
}

func getLastPost(recentPost:(post:[AnyObject])->()) {
    var url : NSURL = NSURL(string: "http://\(urlSite)/api/get_recent_posts/?count=1")!
    dispatch_async(queryQ, {
        var data : NSData? = NSData(contentsOfURL: url)
        if data != nil {
            var responseJson: AnyObject! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil)
            if responseJson != nil {
                var response : [AnyObject] = responseJson.objectForKey("posts") as [AnyObject]
                dispatch_async(dispatch_get_main_queue(), {
                    recentPost(post:response)
                })

            }
        }
    })
}

func getCategory(category:(response:NSDictionary)->()) {
    var url : NSURL = NSURL(string: "http://\(urlSite)/api/get_category_index")!
    dispatch_async(queryQ, {
        var data : NSData? = NSData(contentsOfURL: url)
        if data != nil {
            var responseJson : AnyObject! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil)
            if responseJson != nil {
                var categoryInfos = responseJson.objectForKey("categories") as NSArray
                var categoryName = NSMutableArray()
                var categoryIdArray = NSMutableArray()
                for var i = 0; i < categoryInfos.count; i++ {
                    var titleDictionary : NSDictionary = categoryInfos.objectAtIndex(i) as NSDictionary
                    var idCategory = categoryInfos.objectAtIndex(i) as NSDictionary
                    var categoryId : AnyObject! = idCategory.objectForKey("id")
                    var categoryIdString : String = "\(categoryId)"
                    var title : NSString = titleDictionary.objectForKey("title") as NSString
                    categoryName.addObject(title.stringByReplacingOccurrencesOfString("&amp;", withString: "&"))
                    categoryIdArray.addObject(categoryIdString)
                }
                dispatch_async(dispatch_get_main_queue(), {
                    category(response:NSDictionary(objects: categoryIdArray, forKeys: categoryName))
                })
            } else {
                category(response:NSDictionary(object: "Erreur lors de la connexion à la base de donnée", forKey: "Erreur"))
            }

        }
    })
}

func search(text:String, searchResult:(result:NSArray)->()) {
    var url : NSURL = NSURL(string: "http://\(urlSite)/api/get_search_results?search=\(text)")!
    dispatch_async(queryQ, {
        var data : NSData? = NSData(contentsOfURL: url)
        if data != nil {
            var jsonData : AnyObject! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil)
            if jsonData != nil {
                dispatch_async(dispatch_get_main_queue(), {
                    searchResult(result:jsonData.objectForKey("posts") as NSArray)
                })
            }
        }
    })
}

func getPostOfCategory(categoryId:String, post:(post:NSArray)->()) {
    var url : NSURL = NSURL(string: "http://\(urlSite)/api/get_category_posts/?id=\(categoryId)!")!
    dispatch_async(queryQ, {
        var data : NSData? = NSData(contentsOfURL: url)
        if data != nil {
            var jsonData : NSDictionary! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil) as NSDictionary
            if jsonData != nil {
                dispatch_async(dispatch_get_main_queue(), {
                    post(post:jsonData.objectForKey("posts") as NSArray)
                })
            }
        }
    })
}

func getPostWithId(postsId:NSArray, postFromId:(post:NSArray)->()) {
    var posts = NSMutableArray()
    dispatch_async(queryQ, {
        for var i = 0; i < postsId.count; i++ {
            var url = NSURL(string: "http://\(self.urlSite)/api/get_post/?id=\(postsId.objectAtIndex(i))")
            var data : NSData? = NSData(contentsOfURL: url!)
            if data != nil {
                var jsonData : AnyObject! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil)
                if jsonData != nil {
                    posts.addObject(jsonData.objectForKey("post")!)
                }
            }
        }
        dispatch_async(dispatch_get_main_queue(), {
            postFromId(post:posts)
        })
    })
}

func getCountOfPost(post: NSArray, count:(count:NSArray)->()) {
    var url = NSURL(string: "http://\(urlSite)/api/get_category_index")
    dispatch_async(queryQ, {
        var data : NSData? = NSData(contentsOfURL: url!)
        if data != nil {
            var jsonData : AnyObject! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil)
            if jsonData != nil {
                var categoryInfos : NSArray = jsonData.objectForKey("categories")! as NSArray
                var countArray = NSMutableArray()
                for var i = 0; i < categoryInfos.count; i++ {
                    var categoryId: AnyObject! = categoryInfos.objectAtIndex(i)
                    countArray.addObject(categoryId.objectForKey("post_count")!)
                }
                dispatch_async(dispatch_get_main_queue(), {
                    count(count:countArray)
                })
            }
        }

    })
}

func loadMorePost(newPost:(post:NSArray)->()) {
    page++;
    var url = NSURL(string: "http://\(urlSite)/api/get_recent_posts/?page=\(page)")
    dispatch_async(queryQ, {
        var data : NSData? = NSData(contentsOfURL: url!)
        if data != nil {
            var jsonData : AnyObject! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil)
            if jsonData != nil {
                var newPostArray : NSArray = jsonData.objectForKey("posts") as NSArray
                dispatch_async(dispatch_get_main_queue(), {
                    newPost(post:newPostArray)
                })
            }
        }
    })
}

func loadMorePostInCategory(categoryId:String, newPost:(post:NSArray)->()) {
    if categoryId != categoryID {
        categoryID = categoryId
        categoryPage = 1
    }
    categoryPage++;
    var url = NSURL(string: "http://\(urlSite)/api/get_category_posts/?id=\(categoryId)&page=\(categoryPage)")
    dispatch_async(queryQ, {
        var data : NSData? = NSData(contentsOfURL: url!)
        if data != nil {
            var jsonData : AnyObject! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil)
            if jsonData != nil {
                var newPostArray : NSArray = jsonData.objectForKey("posts") as NSArray
                dispatch_async(dispatch_get_main_queue(), {
                    newPost(post:newPostArray)
                })
            }
        }
    })

}

func thumbnailOfPost(post:NSArray, images:(thumbnail:[AnyObject])->()) {
    var imageUrlArray : [AnyObject] = []
    for postArticle in post {
        var thumbnail : String = postArticle.objectForKey("thumbnail") as String
        imageUrlArray.append(thumbnail)
    }
    images(thumbnail: imageUrlArray)
}

func getImagesOnPost(post:AnyObject, images:(images:[AnyObject])->()) {
    var imageUrlArray : [AnyObject] = []
        var attachments : NSArray = post.objectForKey("attachments")! as NSArray
        if attachments.count > 0 {
            for imagesPost in attachments {
                var imagesDictionary : NSDictionary = imagesPost.objectForKey("images") as NSDictionary
                var imagesInfos : NSDictionary = imagesDictionary.objectForKey("full") as NSDictionary
                var imageUrl : String = imagesInfos.objectForKey("url") as String
                imageUrlArray.append(imageUrl)
            }
        } else {
            imageUrlArray.append("")
        }
    images(images: imageUrlArray)
}

func getAttachmentsOfPost(post:NSArray, images:(images:[AnyObject])->()) {
    var imageUrlArray : [AnyObject] = []
    for postArticle in post {
        var attachments : NSArray = postArticle.objectForKey("attachments")! as NSArray
        if attachments.count > 0 {
            var contentOfAttachments : NSDictionary = attachments.firstObject as NSDictionary
            var imagesDictionary : NSDictionary = contentOfAttachments.objectForKey("images") as NSDictionary
            var imagesInfos : NSDictionary = imagesDictionary.objectForKey("full") as NSDictionary
            var imageUrl : String = imagesInfos.objectForKey("url") as String
            imageUrlArray.append(imageUrl)
        } else {
            imageUrlArray.append("")
        }
    }
    if imageUrlArray.count == post.count {
        images(images: imageUrlArray)
    }
}

}