2016-08-09 7 views
0

目的のCクラス関数が完了したら、Swiftで配列を作成しようとしています。私は目的のCの関数でDoWithBlockを使用していますが、私はIOSに慣れていて、実際に正しい順序で実行されているかどうか試してみようとしています。Objective C to Swift - DoWithBlock

私はここで解決策を見つけるのに手伝ってもらえましたが、私がその答えにとどまったことが正しいのかどうかは分かりません。新しい質問になるはずです。

- (void)scanTableDoWithBlock:(void(^)(NSArray *scanResult, NSError *error))handler { 

    AWSDynamoDBObjectMapper *dynamoDBObjectMapper = [AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper]; 
    AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new]; 
    scanExpression.limit = @10; 


    [[dynamoDBObjectMapper scan:[Mapper class] 
        expression:scanExpression] 
    continueWithBlock:^id(AWSTask *task) { 
     if (task.error) { 
      NSLog(@"The request failed. Error: [%@]", task.error); 
      if (handler != nil) { 
       handler(nil, task.error); 
      } 
     } 
     if (task.exception) { 
      NSLog(@"The request failed. Exception: [%@]", task.exception); 
     } 
     if (task.result) { 
      AWSDynamoDBPaginatedOutput *paginatedOutput = task.result; 
      NSMutableArray *scanResult = [[NSMutableArray alloc] initWithArray:paginatedOutput.items]; //// ADDED ///// 

      if (handler != nil) { 
       handler([scanResult copy], nil); 
      } 
     } 

     return nil; 
    }];  
} 
@end 

その後迅速クラスに私はObjective Cの関数を呼び出していると私はこのような配列を作成する期待しています:

客観Cクラスで

私はこのようなブロックで関数を呼び出しています

override func viewDidLoad() { 
    super.viewDidLoad() 

    let scanTable = ScanTable(); 

    scanTable.scanTableDoWithBlock { (scanResult, error) in 

     let swiftArray = scanTable.scanResult 
    } 

はコード客観C関数が完了したときにのみ実行「swiftArray = scanTable.scanResultましょう」または、それは他の前に実行された場合、それはただ純粋な運だろうを行います。私はすぐにブロックを使用することに関する良い文書を見つけることができませんでした。あなたの助けのための

おかげ

///は、上に。細かいことをループのためのスキャン機能の中で配列が作成され、Iされている(SWIFT viewwilappear対物Cスキャン機能を呼び出すことができますでの私の最新の試みを編集します私は両方の配列を取得しています迅速な側面は、nillのコードが実行されているとして戻って////

class RateSongsViewController: UIViewController { 

    override func viewWillAppear(animated: Bool) 
    { 
     super.viewWillAppear(animated) 


     let scanTable = ScanTable(); 

     scanTable.scanTableDoWithBlock { (scanResult, error) in 

      let swiftArray = scanTable.scanResult 


      if (scanTable.scanResult == nil){ 

       print(" scanResult ARRAY IS NILL") 

      } else { 
       print(" scanResult ARRAY IS NOT NILL") 
      } 

      if (swiftArray == nil){ 

       print(" SWIFT ARRAY IS NILL") 

      } else { 
       print(" SWIFT ARRAY IS NOT NILL") 
      } 

     } 

    } 
+1

ここに素早いブロックを理解するのに良い記事です。http://fuckingswiftblocksyntax.com/(ウェブサイト名は厄介です:)) – raki

+0

ありがとう@raki私はそれをチェックアウトします。 –

答えて

1
  1. viewDidLoadscanTable.scanTableDoWithBlockを呼び出さないでください。MainThreadにその重計算が、それは、ビューの移行が遅れます場合。 viewDidAppearで電話してください。
  2. ​​は、scanTableDoWithBlock完了後にコールします。それが完了ブロックを呼び出すことはありませんので、

  3. task.exception場合は

    if (handler != nil) { 
        handler(nil, nil); 
    } 
    

return nilを外し呼び出す必要があります。

+0

助けてくれてありがとう。それをすべて修正しました。私が理解できない唯一のことは、リターンリターンを取除いて言うところです。もし私がそうするならば、私はエラー "コントロールが非空白ブロックの終わりに達する"を得ます。もう一度ありがとう –

+0

また、私はちょうどチェックし、作成された配列はnilです。しかし、そこから来ているNSMutableArrayはまだ作成されているのでNo.2ではまだ問題が残っています(私はまだリターンがないのでできますか?) –

+0

私はdynamoDBObjectMapperメソッドがAWSTaskを返すか、または完了した後に来るいくつかの値を調べると思います。 –

関連する問題