2015-01-14 1 views
1

죄송합니다. 내가 말하는 것이 완전히 잘못되었지만 신속한 작업이 새로운 경우 죄송합니다.데이터 관리자가 View Controller에 콜렉션을 다시로드하도록 지시하려면 어떻게해야합니까?

uicollectionsview가 포함 된 UIViewController가 있습니다. 그런 다음 instagram에서 json 데이터를 가져온 데이터 관리자를 파싱합니다. 내가 알고 싶은 것은 데이터 관리자가 ViewController에게 컬렉션 뷰의 데이터를 다시로드하도록 지시하는 방법입니다. 데이터 관리자가 ViewController에게 데이터를 다시로드하라고 지시 할 때마다 나에게 그것이 nil이라는 오류가 발생합니다. 데이터 관리자가 뷰 컨트롤러의 새로운 인스턴스를 작성했기 때문에 싱글 톤 디자인 패턴을 사용하여 작동하도록했기 때문에 생각하고 있습니다. 그러나 .instance를 사용할 때 어떤 이유로 인해 충돌합니다. 나는 그 부분을 주석 처리했다.

나는 또한 스레드를 사용하여 작동 시키려고했지만 여전히 운이 좋았습니다.

정보가 없다는 것을 알았습니다.보기 컨트롤러에 버튼이있어서 버튼을 누르면 컬렉션보기가 다시로드되고 모든 데이터가 컬렉션보기로로드됩니다.

다른 것들도 시도했지만 아무런 효과가 없을 수도 있습니다. DataManager는 지금

class InstagramControllerView: UIViewController, MWPhotoBrowserDelegate, UICollectionViewDelegate { 
class var sharedInstance : InstagramControllerView { 
    struct Static { 
     static var onceToken : dispatch_once_t = 0 
     static var instance : InstagramControllerView? = nil 
    } 
    dispatch_once(&Static.onceToken) { 
     Static.instance = InstagramControllerView() 
    } 
    return Static.instance! 
} 

//OUTLETS 
@IBOutlet weak var collectionView: UICollectionView! 

//let navigationController = InstagramNavigationController() 

/* this will hold all of the information 
** pertaining to this instagram account 
*/ 
//let instagramHeader = InstagramHeader() 
var nextUrl = "" 

var dataManagerDone: Bool = false 

let instagramDataManager = InstagramDataManager() 

//arrays to hold instagram content 
var headerResults: JSON? 
var results: [JSON]? = [] 
var photos: [MWPhoto] = [] 
var thumbnailArr: [String] = [] 
var standardResArr: [String] = [] 
var descriptionArr: [String] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 
// self.collectionView.reloadData() 
//  let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
//  dispatch_async(dispatch_get_global_queue(priority, 0), { 
//   self.instagramDataManager.getProfileInfoJson(self.profileUrlPath) 
//   let thum = self.instagramDataManager.getImageDataJson(self.photoUrlPath) 
//   dispatch_async(dispatch_get_main_queue(), { 
//     println("this is thumb \(thum)") 
//     self.collectionView.reloadData() 
//     println("i made it to view laod") 
//   }) 
//  }) 
} 

@IBAction func refresh(sender: UIButton) { 
    self.refreshCollectionView() 
} 

func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 
    var bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height; 
    if (bottomEdge >= scrollView.contentSize.height) { 
     instagramDataManager.getNextSetOfImages() 
    } 
} 

func refreshCollectionView(){ 
    self.collectionView.reloadData() 
} 

:

class InstagramDataManager { 

var profilePictureURL: NSURL? 
var postCount: String? 
var followerCount: String? 
var followingCount: String? 
var username: String? 
var bio: String? 
var website: String? 

var doneParsingProfile: Bool = false 
var doneParsingImage: Bool = false 

//arrays to hold instagram content 
var results: [JSON]? = [] 
var thumbnailArr: [String] = [] 
var standardResArr: [MWPhoto] = [] 
var descriptionArr: [String] = [] 

let profileUrlPath = "https://api.instagram.com/v1/users/22755819/?access_token=fdasf" 
let photoUrlPath = "https://api.instagram.com/v1/users/22755819/media/recent/?count=65&access_token=jdkfjs" 
var nextUrl = "" 

init(){ 
    self.getProfileInfoJson(profileUrlPath) 
    self.getImageDataJson(photoUrlPath) 
} 

//returns true when done 
func getProfileInfoJson(urlPath: String) -> Bool { 
    Alamofire.request(.GET, urlPath).responseJSON { (request, response, json, error) in 
     if json != nil { 
      var jsonObj = JSON(object: json!) 
      self.parseProfileData(jsonObj) 
     } 
    } 
    return true 
} 

//returns true when done 
func getImageDataJson(urlPath: String){ 
    Alamofire.request(.GET, urlPath).responseJSON { (request, response, json, error) in 
     if json != nil{ 
      var jsonObj = JSON(object: json!) 
      if let data = jsonObj["data"].arrayValue as [JSON]? { 
       self.results? += data 
       self.parseImageData(data) 
      } 
      if let paginationUrl = jsonObj["pagination"]["next_url"].stringValue? { 
       self.nextUrl = paginationUrl 
      }else{ 
       self.nextUrl = "" 
      } 
     } 
    } 
} 

private func parseImageData(jsonData: [JSON]){ 
    for i in 0..<jsonData.count{ 
     if let thumbnail = jsonData[i]["images"]["thumbnail"]["url"].stringValue? { 
      self.thumbnailArr.append(thumbnail) 
     } 
     if let standardResPhoto = jsonData[i]["images"]["standard_resolution"]["url"].stringValue? { 
      self.standardResArr.append(MWPhoto(URL: NSURL(string: standardResPhoto))) 
     } 
     if let description = jsonData[i]["caption"]["text"].stringValue? { 
      self.standardResArr[i].caption = description 
     } 
    } 
    self.doneParsingImage = true 
    doneParsing() 
} 

private func parseProfileData(json: JSON){ 
    if let photoUrl = json["data"]["profile_picture"].stringValue? { 
     self.profilePictureURL = NSURL(string: photoUrl) 
    } 
    if let postCount = json["data"]["counts"]["media"].stringValue? { 
     self.postCount = postCount 
    } 
    if let follows = json["data"]["counts"]["follows"].stringValue? { 
     self.followingCount = follows 
    } 
    if let followers = json["data"]["counts"]["followed_by"].stringValue? { 
     self.followerCount = followers 
    } 
    if let username = json["data"]["username"].stringValue? { 
     self.username = username 
    } 
    if let bio = json["data"]["bio"].stringValue? { 
     self.bio = bio 
    } 
    if let website = json["data"]["website"].stringValue? { 
     self.website = website 
    } 
    self.doneParsingProfile = true 
    doneParsing() 
} 

//reload collection view once both image and profile have been parsed 
private func doneParsing(){ 
    if self.doneParsingImage && self.doneParsingProfile { 
     //InstagramControllerView.sharedInstance.collectionView.reloadData() 
    } 
} 

즉 불필요한에서 내가 분명히 몇 가지 코드를 왼쪽으로 한

아래의 ViewController에 대한 코드입니다.

내가 얻을 수있는 도움이 있으면 대단히 감사하겠습니다. 미리 감사드립니다.

+0

'getNextSetOfImages()'가 정의 된 곳을 알지 못합니다. – Firo

+0

@Firo 나는 밖으로 나가면 떠났다. 스크롤 뷰의 맨 아래에 도달 할 때까지 아무 것도하지 않습니다. 다음 이미지 세트를로드하는 것입니다 – user2197126

+0

왜 대리자 패턴을 사용하지 않으시겠습니까? 귀하의보기 컨트롤러가 datamanager의 대리인이 될 수 있도록? –

답변

3

기본적으로 콜렉션 뷰를 가져오고 새로 고치려고 시도하는 대신 InstagramVC가 DataManager에 데이터 수신시 실행할 블록을 제공하기를 원합니다. 이 방법으로 모든 객체는 Instagram 데이터를 요청할 수 있습니다. Instagram Manager는 특별히 컨트롤러에 묶여서는 안됩니다. 데이터가 반환되면 당신이 실행 한하고자하는 조각에 전달할 데이터를 요청할 때 다음

func getImageDataJson(urlPath: String, completion:() ->()) { 
    Alamofire.request(.GET, urlPath).responseJSON { (request, response, json, error) in 
     if json != nil { 
      var jsonObj = JSON(object: json!) 
      if let data = jsonObj["data"].arrayValue as [JSON]? { 
       self.results? += data 
       self.parseImageData(data) 
      } 

      // Not sure where you want this but let's just execute the block here 
      completion() 

      if let paginationUrl = jsonObj["pagination"]["next_url"].stringValue? { 
       self.nextUrl = paginationUrl 
      } else { 
       self.nextUrl = "" 
      } 
     } 
    } 
} 

: 그래서이 일을 먼저 요청 데이터에 코드 블록을 전달할 필요가

self.instagramDataManager.getProfileInfoJson(self.profileUrlPath) { 
    // Upon completion of receiving data refresh my collection view 
    self.collectionView.reloadData() 
} 

그리고 너 끝났어. 그럼 싱글 톤과 관련된 모든 것을 제거하십시오 !!!

+0

그것은 일했다 !!! 나는 코드 블록 정보에 대해 몰랐다. 도와 주셔서 감사합니다 !! – user2197126

+0

그래, 문제 없어. 그 싱글 톤 코드를 정리하는 것이 정말로 확실합니다! 여기서 싱글 톤을 사용해서는 안됩니다. – Firo

관련 문제