2014-10-18 3 views
1

У меня есть метод с именем importStories(), который вызывает метод getStatusesUserTimelineWithUserID для импорта данных временной шкалы из Twitter с помощью сторонней библиотеки Swifter. Проблема в том, что метод возвращается до того, как любые значения будут установлены в twitterData. Любые советы приветствуются.Функция Swift не работает

func importStories() -> [String] { 

    let twitterAccount = Swifter(REDACTED) 

    var twitterData = [String]() 

    twitterAccount.getStatusesUserTimelineWithUserID("REDACTED", count: 0, sinceID: nil, maxID: nil, trimUser: true, contributorDetails: false, includeEntities: true, success: { (statuses) -> Void in 
     if statuses != nil { 
      for var i=0; i<statuses!.count; i++ { 
       twitterData.append(statuses![i]["text"].string!) 
      } 
     } 
    }) { (error) -> Void in 

    } 

    return twitterData 
} 


public func getStatusesUserTimelineWithUserID(userID: String, count: Int?, sinceID: Int?, maxID: Int?, trimUser: Bool?, contributorDetails: Bool?, includeEntities: Bool?, success: ((statuses: [JSONValue]?) -> Void)?, failure: FailureHandler?) { 
    var parameters: Dictionary<String, AnyObject> = ["user_id": userID] 

    self.getTimelineAtPath("statuses/user_timeline.json", parameters: [:], count: count, sinceID: sinceID, maxID: maxID, trimUser: trimUser, contributorDetails: contributorDetails, includeEntities: includeEntities, success: success, failure: failure) 
} 
+1

Это происходит потому, что getStatusesUserTimelineWithUserID - это асинхронный метод, то есть вы его называете, но вы не знаете, когда вернется результат. Одним из способов преодоления этой проблемы является использование шаблона делегирования (http://en.wikipedia.org/wiki/Delegation_pattern#Objective-C_example). – CjCoax

+1

@CjCoax Спасибо! Я попробую. – TBDO

ответ

0

Вот образец, который я использую много. Он может выглядеть лучше с некоторыми типами, но я не использовал его для этого кода.

Ключевым моментом здесь является возвращение результата путем вызова блока, который предоставляется вызывающим кодом.

func importStoriesWithSuccess(success:(result: [String]) -> Void, failure: (error: NSError) -> Void) { 

    let twitterAccount = Swifter(REDACTED) 

    var twitterData = [String]() 

    twitterAccount.getStatusesUserTimelineWithUserID("REDACTED", count: 0, sinceID: nil, maxID: nil, trimUser: true, contributorDetails: false, includeEntities: true, success: { (statuses) -> Void in 
     if statuses != nil { 
      for var i=0; i<statuses!.count; i++ { 
       twitterData.append(statuses![i]["text"].string!) 
      } 
      success(result: twitterData) 
     } 
     }) { (error) -> Void in 
      failure(error: error) 
    } 
} 

Как cjcoax уже упоминалось, в коде twitterData возвращается до twitterAccount выполняет блок вы предоставили ему. Вот почему ваши twitterData пустые.

+0

Ах, огромное спасибо! Это именно то, что я искал! – TBDO

Смежные вопросы