2014-10-18 51 views
1

我创建了一个名为importStories()的方法,该方法调用getStatusesUserTimelineWithUserID方法,使用第三方库Swifter从Twitter导入时间轴数据。问题在于,在将任何值设置为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 2014-10-18 04:02:35

+1

@CjCoax谢谢!我会试一试。 – TBDO 2014-10-18 04:06:07

回答

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 2014-10-18 04:30:05