2016-08-09 2 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 

이어서 신속 클래스 I가 목표 C 함수를 호출하고 있는데 이런 배열을 만드는 바라고 :

대물 C 클래스

이 같은 블록으로 함수를 호출하고

override func viewDidLoad() { 
    super.viewDidLoad() 

    let scanTable = ScanTable(); 

    scanTable.scanTableDoWithBlock { (scanResult, error) in 

     let swiftArray = scanTable.scanResult 
    } 

코드 목적 C 함수가 완료된 경우에만 실행 "swiftArray = scanTable.scanResult하자"또는 다른 이전에 실행 한 경우 그냥 순수 행운이 될 것입니다합니까. 신속하게 블록을 사용하는 것에 대한 좋은 문서를 찾을 수 없었습니다. 당신의 도움에 대한

감사

/// 배열이 생성되고 스캔 기능 내에서 신속 viewwilappear의 목적 C 스캔 기능을 (호출에 내 최신 시도를 편집하고 내가 할 수있는 루프 잘.에에 그것을 통해 내가 두 배열을 얻고 신속한 쪽은 빈 채로 코드가 실행으로 돌아가 ////

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. viewDidLoad에서 scanTable.scanTableDoWithBlock를 호출하지 마십시오 MainThread에 무거운 계산이는 뷰 전환을 지연됩니다. viewDidAppear으로 전화하십시오.
  2. let swiftArray = scanTable.scanResultscanTableDoWithBlock 완료 후에 호출합니다. 가 완료 블록을 호출하지 않기 때문에

  3. task.exception 경우에 당신은

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

return nil 제거를 호출해야합니다.

+0

도움을 주셔서 감사합니다. 모든 것을 수정했습니다. 내가 이해할 수없는 유일한 점은 return nil을 제거한다고 말하는 것입니다. 내가 그렇게하면 "통제가 비공개 블록의 끝에 도달"이라는 오류가 발생합니다. 다시 한 번 감사드립니다 –

+0

또한 방금 확인한 결과 생성 된 배열은 0입니다. 하지만 그것이 나오고있는 NSMutableArray는 아직 만들어지고 있습니다. 그래서 No.2에서 여전히 문제가 있습니다 (여전히 반환이 없기 때문에 가능할 수 있습니까?). –

+0

나는 dynamoDBObjectMapper 메서드가 AWSTask를 반환한다고 생각한다. –