2013-03-14 24 views
37

Tôi biết rằng có rất nhiều cách để trì hoãn một hành động trong Objective-C như:Objective-C với khối

performSelector:withObject:afterDelay: 

hoặc sử dụng NSTimer.

Nhưng có một điều như vậy ưa thích được gọi là khối nơi bạn có thể làm điều gì đó như thế này:

[UIView animateWithDuration:1.50 delay:0 options:(UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState) animations:^{ 

    }completion:^(BOOL finished){ 
}]; 

Thật không may, phương pháp này chỉ áp dụng cho hiệu ứng động vật.

Làm thế nào tôi có thể tạo ra một sự chậm trễ với một khối trong một phương pháp vì vậy tôi không cần phải sử dụng tất cả những @selectors và mà không cần phải tạo ra một mới phương pháp riêng biệt? Cảm ơn!

+0

Sẽ điều này giúp bạn? http://stackoverflow.com/questions/15218861/call-function-only-after-reloaddata-has-finished/15218941#15218941 –

+0

tại sao bạn sợ tạo một phương pháp riêng biệt? điều này sẽ giải quyết vấn đề ngay lập tức. – Raptor

+0

@ShivanRaptor vì tôi có rất nhiều phương pháp và tôi muốn tìm cách tốt hơn –

Trả lời

113

sử dụng dispatch_after:

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    //code to be executed on the main queue after delay 
    [self doSometingWithObject:obj1 andAnotherObject:obj2]; 
}); 
+0

huh, tất cả những điều "công văn" này trở nên phổ biến .. – Stas

+0

cũng cải thiện khả năng đọc rất nhiều - đặc biệt khi bạn sử dụng các khối làm thông số phương pháp –

+4

Sẽ thật tuyệt vời để ẩn (đặc biệt là tính toán 'popTime') trong một hàm/phương thức, ví dụ '[NSObject performBlock: afterDelay:];' – Sulthan

21

Mở rộng trên câu trả lời được chấp nhận, tôi đã tạo ra một chức năng trợ giúp cho những ai không quan tâm để ghi nhớ cú pháp mỗi khi họ muốn làm điều này :) Tôi chỉ đơn giản là có một Utils lớp với điều này:

cách sử dụng:

[Utils delayCallback:^{ 
    //--- code here 
} forTotalSeconds:0.3]; 

phương pháp Helper:

+ (void) delayCallback: (void(^)(void))callback forTotalSeconds: (double)delayInSeconds{ 

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
      if(callback){ 
       callback(); 
      } 
     }); 
} 
2

Đây là cách bạn có thể kích hoạt một khối sau khi một sự chậm trễ trong Swift:

runThisAfterDelay(seconds: 4) {() ->() in 
    print("Prints this 4 seconds later in main queue") 
    // Or just call animatedMyObject() right here 
} 

/// EZSwiftExtensions 
func runThisAfterDelay(seconds seconds: Double, after:() ->()) { 
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC))) 
    dispatch_after(time, dispatch_get_main_queue(), after) 
} 

của nó bao gồm như là một chức năng tiêu chuẩn trong repo của tôi: https://github.com/goktugyil/EZSwiftExtensions

Các vấn đề liên quan