2017-01-31 2 views
1

여러 소스에서 데이터를 가져 오는 핵심 데이터 프로젝트가 있습니다. 모든 데이터가 저장되는 것은 아니므로 저장하기 전에 데이터를 전달하는 구조체를 만들었습니다. 나는 UITableView 섹션을 표시 할 때문에싱글 톤이 원하는대로 작동하지 않습니다.

struct SearchResult { 
    var myURL: String? 
    var myHeadline: String? 

    init() {} 

    init(myURL: String, myHeadline: String) { 
     self.myURL = myURL 
     self.myHeadline = myHeadline 
    } 
} 

, 나는뿐만 아니라, 그에 대한 struct을 만들어 :

struct ResultsObjects { 
    var sectionName: String? 
    var sectionObjects = [SearchResult]() 

    init() {} 

    init(sectionName: String) { 
     self.sectionName = sectionName 
    } 
} 

마지막으로, 나는 유지 유지하기 위해 singleton을 만들어 그들을 절약 할 SearchResult 객체 이전 managedObjectContext.

class SearchResultsArray { 
    static let sharedInstance = SearchResultsArray() 
    var resultsObjectsArray = Array<ResultsObjects>() 
    fileprivate init() {} 
} 

내 목표는 여러 클래스를 통해 액세스 할 수있는 SearchResultsArray 클래스가 하나 개의 클래스에로 ResultsObjects를 덤프 할 수 있어야하고, 다른에서 ResultsObjects을 볼 수있다. 다음과 같이 MyViewController

, 나는 SearchResultsArray를 인스턴스화하고 있습니다 :

var resultsObjectsArray = SearchResultsArray.sharedInstance.resultsObjectsArray 

는 내가 채울 resultsObjectsArray을 사용하십시오 UITableViewController 있습니다.

MyViewController에서 단추는 MyParserClass의 메서드를 사용하는 메서드를 호출하여 웹 페이지를 구문 분석합니다. 이것도 작동합니다.

MyParserClassMyViewController과 동일한 방법으로 resultsObjectsArray를 선언하는 방법은 SearchResult 객체를 생성 ResultsObjects로 덤프 및 SearchResultsArray.resultsObjectsArray로 추가하는 MyParserClass에서

var resultsObjectsArray = SearchResultsArray.sharedInstance.resultsObjectsArray 

불린다. 이것은 잘 작동합니다. 나는 resultsObjectsArray로 덤프됩니다 ResultsObjects를 생성하는 방법에 다음 줄에 던졌다 : 나는 MyViewControllerupdateSearchResults 대리자 메서드에 인쇄 문을 던졌다와 관계없이 거기에 있었다 말씀 MyParserClass의, 0 반환

print("\(resultsObjectsArray.count) ResultsObjects in SearchResultsArray") 
delegate.updateSearchResults() 

위임 메서드를 호출하기 바로 전에.

응용 프로그램이 충돌하지 않지만 싱글 톤에 문제가있는 것 같습니다. 어떤 제안을 다시 : 내가 뭘 잘못하고있어 크게 감사합니다.

+0

본 게시물을 보았습니까? http://stackoverflow.com/questions/26742138/singleton-in-swift 우리는 배수를 얻지 못하도록 둘 다 '최종'클래스를 선언해야한다고 제안합니다. 체크 아웃 할 가치가있다 – Russell

+1

배열은 신속한 값 유형이다. 인스턴스 변수를 사용하여 배열을 참조 할 수 없습니다. 항상'SearchResultsArray.sharedinstance.resultsObjectsArray'를 사용해야합니다 – Paulw11

+0

@ Paulw11 Wow! 나는 내가 간단한 것을 놓치고 있다는 것을 알았지 만, WOW! 답변 해 주셔서 대단히 감사합니다. 나는 그것을 매우 감사한다. – Adrian

답변

1

배열은 신속한 값 유형으로 배열에 변수를 할당 한 다음 해당 변수를 다른 변수에 할당하면 두 번째 변수는 원본 배열이 아닌 원본 배열의 복사 (기술적으로 효율성을 높이기 위해 배열은 수정시 복사되고 할당되지는 않지만 결과는 동일 함) 원래 배열의 변경 사항은 두 번째 변수의 배열에 반영되지 않습니다 .

someOtherVariable 여전히 비어있을 것 중에 하나의 값이 포함됩니다

var someArray = [Int]() 
var someOtherVariable = someArray 
someArray.append(2) 

someArray

을 고려하십시오.

하나의 솔루션은 항상 로컬 변수/속성보다는 SearchResultsArray.sharedinstance.resultsObjectsArray을 사용합니다.

아마도 더 나은 방법은 배열을 조작하는 몇 가지 기능을 제공하여 싱글 톤 클래스에 배열을 캡슐화하는 것입니다. 예를 들어; 클래스가 더 명확하게 그 의미를 정의한다, results 이후

class SearchResultsArray { 
    static let sharedInstance = SearchResultsArray() 
    var resultsObjectsArray = Array<ResultsObjects>() 

    public var results: [ResultsObjects] { 
     get { 
      return resultsObjectsArray 
     } 
    } 


    public func add(results: ResultsObjects) { 
     resultsObjectsArray.append(results) 
    } 


    fileprivate init() {} 
} 

이제 읽기 전용 속성이며, 별도의 add 기능이 존재합니다.

+0

고맙습니다. 나는 엄청난 양을 배웠다! – Adrian

+0

클리어/리셋 명령을 추가하십시오. – muescha

+1

물론 가능합니다. 이것은 완전한 해결책이 아니라 모범이되기위한 것이 었습니다. – Paulw11

0

나는 싱글 톤을 매우 비슷한 방식으로 사용합니다. 그러나 나는 그것을 아주 다르게 정의합니다.

편집 - 다르게, 지금 내 경우에는 싱글 DataModelInstance

:-(대체, 나는 정의에 액세스해야하는 모든 클래스에서,이

class DataModelInstance : NSObject, NSCoding 
{ 
    // define all of the variables I need within the singleton 

    class var sharedInstance : DataModelInstance 
    { 
     struct Singleton 
     { 
      static let instance = DataModelInstance() 
     } 
     return Singleton.instance 
    } 

    // everything else that I need in the class... 
} 

하고 있습니다 변수

var dataModel = DataModelInstance.sharedInstance 
+1

에 대한 google은 DataModelInstance 내부에 있습니까? 작은 DataModelInstance를 추가하여 더 명확하게 "내부 싱글 톤"이 무엇인지 확인 하시겠습니까? – muescha

+0

ok - 답변을 업데이트했습니다. 나는 어떤 NSCoding 메소드 나 내가 구현 한 데이터 레벨 메소드를 포함하지 않았지만 이것은 내 ViewControllers 전체에서 싱글 톤을 수행하기에 충분해야한다. – Russell

+2

@Russell : 싱글 톤을 정의하는 방법은 다음과 같다. superseeded. 이제 OP가 질문에서 한 것처럼 싱글 톤을 정의합니다. –

관련 문제